Skip to content

Bit0r/fscode

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

22 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿงฉ FSCode (File Studio Code) โ€” Operate files like writing code

English ็ฎ€ไฝ“ไธญๆ–‡

PyPI License: MIT GitHub Stars

๐Ÿš€ What Can It Do?

fscode can generate a "code text" file containing information about the filenames you pass in. You can then perform file operations directly through your code editor.

โšก๏ธ Video Demo (Very Important!!!)

fscode-demo.mp4

๐Ÿ Quick Start

pip install PyFSCode

# Linux/MacOS
find ./photos -name "*.jpg" | fscode --editor='code -w' *.txt
# Windows
ls -Name -Force -Recurse | fscode

โœจ Core Features

  • ๐Ÿ’ป Editor as UI โ€” Use the code editing capabilities of VS Code/Jetbrains to operate files;
  • ๐Ÿง  Smart Dependency Handling โ€” Automatically resolves swap, cycle, and move conflicts;
  • ๐Ÿ›ก๏ธ Safe and Controllable โ€” Does not modify files directly, only generates a reviewable file operation script;
  • ๐Ÿงฐ Full Features Support โ€” Supports creation, copying, moving, deleting, renaming and Symlink.
  • ๐ŸŽจ Custom Commands - For example, you can replace touch with ai-generate to create files with content.
  • ๐Ÿท๏ธ Custom Command Prefix - For example, you can use sudo as a prefix for the output script.

๐Ÿ“ฆ Installation

pip install PyFSCode
# Or using uv
uv tool install PyFSCode

๐Ÿง‘โ€๐Ÿ’ป Usage Example

๐Ÿ’ป Step 1: Input Files from Command Line

โš ๏ธ [NOTE]: If your $VISUAL or $EDITOR environment variable points to VS Code, please use --editor='code -w' to wait for the window to close before continuing.

Method 1: Input from Pipe

find ./photos -name "*.jpg" | fscode

Method 2: Pass as Arguments

fscode *.jpg *.txt

Method 3: Pipe + Arguments

find ./photos -name "*.jpg" | fscode *.jpg *.txt

Method 4: Use Custom Commands (Advanced Users)

fscode --editor='code -w' --create='new' --remove='del' --move='mov' --exchange='mv --exchange -iT' **

๐Ÿ“„ Step 2: Modify Filenames in the Editor

The editor will open a file similar to this:

# <ID> <Path> [args...]
1 photos/vacation.jpg
2 photos/birthday.jpg
3 project/notes.txt
4 "photos/old picture.jpg"

You just need to modify it:

# File Operation Plan
# ... (comments omitted) ...
#
# My Modifications

# 1. Rename (Edit the path)
1 photos/Paris_Vacation_2025.jpg

# 2. Move (Edit the path)
3 archive/old_notes.txt

# 3. Copy (Duplicate the line, use the same ID 2)
2 photos/birthday.jpg
2 photos/backup_birthday.jpg

# 4. Delete (Delete or comment out the line with ID 4)
# 4 "photos/old picture.jpg"

# 5. Create (Add a new line, ID is 0, quotes are needed due to spaces)
0 'new_project/new note.txt'

# 6. Create a symbolic link
0 note.txt 'new_project/new note.txt'

โšก Step 3: Execute

After saving and closing the editor, FSCode will generate a script:

#!/bin/sh
cp photos/birthday.jpg photos/backup_birthday.jpg
mv photos/vacation.jpg photos/Paris_Vacation_2025.jpg
mv project/notes.txt archive/old_notes.txt
rm 'photos/old picture.jpg'
touch 'new_project/new note.jpg'
ln -snT 'new_project/new note.txt' note.txt

After reviewing it for correctness, execute it:

source ./file_ops.sh

โœ… All changes can be safely reviewed before execution.

๐Ÿ“„ Help Documentation

NAME
    fscode - Main execution flow.

SYNOPSIS
    fscode <flags> [PATHS]...

DESCRIPTION
    Main execution flow.

POSITIONAL ARGUMENTS
    PATHS
        Type: str
        File paths to process. Can be provided as arguments or via stdin.

FLAGS
    --editor=EDITOR
        Type: str
        Default: 'code -w'
        The editor command to use (e.g., "msedit", "code -w"). Defaults to $VISUAL, $EDITOR, or 'code -w'.
    -o, --output_script=OUTPUT_SCRIPT
        Default: 'file_ops.sh'
        Path to write the generated shell script.
    --edit_suffix=EDIT_SUFFIX
        Default: '.sh'
        Suffix for the temporary editing file. Defaults to '.sh'.
    -n, --null=NULL
        Default: False
        Whether to use null-separated input.
    --copy=COPY
        Type: str
        Default: 'cp'
        The command to use for copy operations.
    --move=MOVE
        Type: str
        Default: 'move -Confirm'
        The command to use for move operations.
    --exchange=EXCHANGE
        Type: str
        Default: ''
        The command to use for atomically swap filenames. Currently, only higher versions of Linux support the `mv --exchange -iT` command.
    -r, --remove=REMOVE
        Type: str
        Default: 'del -Confirm -Recurse'
        The command to use for remove operations.
    --create=CREATE
        Type: str
        Default: 'ni'
        The command to use for create operations.
    --create_args=CREATE_ARGS
        Type: str
        Default: 'ni -Confirm...
        The create command with extra arguments (e.g., for symlinks).
    --move_tmp_filename=MOVE_TMP_FILENAME
        Type: Optional[str | None]
        Default: None
        Path for the temporary filename used during cycle move operations.
    -i, --inode=INODE
        Default: False
        Whether to display inode and hard link count. When adding a new row, the Inode and Links columns must be set to None.
    --cmd_prefix=CMD_PREFIX
        Default: ''
        An optional command prefix to prepend to all commands.

๐ŸŒˆ Other Recommended Tools

๐ŸŸ fish alias example

alias -s fscode "fscode --editor='code -w' --create='new' --remove='del' --move='mov' --exchange='mv --exchange -iT'"

๐Ÿชถ Tips

  • To use hard links, you can use --inode to display hard link information. Use --cp='ln -snT' to replace the cp operation.
  • To use soft links, you can modify the [args...] column and set the ID to 0; fscode will then automatically use create_args to create them. If you need to force-create and overwrite, you must manually change --create_args='ln -snTf'. Currently, only the "create" function supports custom arguments. If the project gets 1000 stars โญ, I will consider adding custom arguments for all operations.
  • To use sudo, you can set --cmd_prefix=sudo, which will add this prefix to all commands.

๐Ÿ”— Feature Comparison

Tool โœ…Count Cross-editor Interactive Output Script Custom Commands Move Swap/Cycle Copy Delete Create Symlink Hardlink
edir 5 โœ… โŒ โŒ โŒ โœ… โœ… โœ… โœ… โŒ โŒ โŒ
renameutils 5 โœ… โŒ โŒ โœ… โœ… โœ… โœ… โŒ โŒ โŒ โŒ
pipe-rename 3 โœ… โŒ โŒ โŒ โœ… โœ… โŒ โŒ โŒ โŒ โŒ
massren 4 โœ… โŒ โŒ โŒ โœ… โœ… โŒ โœ… โŒ โŒ โŒ
dired 9 โŒ โœ… โŒ โœ… โœ… โœ… โœ… โœ… โœ… โœ… โœ…
acme 8 โŒ โœ… โŒ โœ… โœ… โŒ โœ… โœ… โœ… โœ…1 โœ…1
up 3 โŒ โœ… โœ… โœ… โŒ โŒ โŒ โŒ โŒ โŒ โŒ
fscode 10 โœ… โŒ โœ… โœ… โœ… โœ… โœ… โœ… โœ… โœ… โœ…2
Note
  1. Due to the nature of Plan 9, the system doesn't use "link" but rather "bind".
  2. Just set --copy='ln -nTf' and --inode, and you can handle hard links just like regular copying.

Appendix

๐Ÿ“„ License

This project is open-sourced under the MIT License.

๐Ÿชถ Tips

Like this project? Please give it a โญ๏ธ Star. Your support helps more people discover it.

About

Manage Your Files with Your Editor

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages