Skip to main content

🧩 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!!!)

Video Demo

🏁 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.

Metadata

Release files for pyfscode 2.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pyfscode 2.0.0
File Size Uploaded Provenance Actions
pyfscode-2.0.0.tar.gz 11.2 kB Without provenance Details for pyfscode-2.0.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for pyfscode 2.0.0
File Interpreter ABI Platform Actions
pyfscode-2.0.0-py3-none-any.whl Python 3 none any Details for pyfscode-2.0.0-py3-none-any.whl

Total release size: 24.1 kB

Release files / pyfscode-2.0.0.tar.gz

Download URL pyfscode-2.0.0.tar.gz
Size 11.2 kB
Tags Source
SHA-256 checksum
How to use checksums
04ace5c4f495d54ecf2c5af4f0e8b9716ad01d1987adb2f29a67d40875ce73fe
BLAKE2b-256 checksum
How to use checksums
1d1a5c16abbfeec8b74bd09eb9af0eaca01ac47135a255194422d57416b44b34
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.9.9 {"installer":{"name":"uv","version":"0.9.9"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / pyfscode-2.0.0-py3-none-any.whl

Download URL pyfscode-2.0.0-py3-none-any.whl
Size 12.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
73da3bfc91c5b4c3ec77aadff1f8f119631c3e7f937e0e374935dcb07725c993
BLAKE2b-256 checksum
How to use checksums
9be27002c7c25e191fa9d01c4376cc2a7e8e65ab168e41baf63a3c828983df9c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.9.9 {"installer":{"name":"uv","version":"0.9.9"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for pyfscode 2.0.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page