Fscode
Manage Your Files with Your Editor
Install / Use
/learn @Bit0r/FscodeREADME
🧩 FSCode (File Studio Code) — Operate files like writing code
🚀 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!!!)
🏁 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
touchwithai-generateto create files with content. - 🏷️ Custom Command Prefix - For example, you can use
sudoas 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
--inodeto 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 | ❌ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅<sup>1</sup> | ✅<sup>1</sup> | | up | 3 | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | | fscode | 10 | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>2</sup> |
Note
- Due to the nature of Plan 9, the system doesn't use "link" but rather "bind".
- 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.
Related Skills
node-connect
350.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
109.9kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
350.1kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
350.1kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
