如何根据文件名将所有文件复制到子目录?

How do I copy all files to a sub directory based on the file name?

我确信 bash 脚本可以做到这一点,但我想确保我没有遗漏一些明显的东西。 Google 没有多大帮助,所以也许你可以。

假设一个目录有以下文件

dir/file1
dir/newfile2
dir/oldfile3

我想根据文件名的前两个字母找出将文件夹中的所有文件复制到 2 层深的文件夹的最佳解决方案,因此结果是

dir/f/i/file1
dir/n/e/newfile2
dir/o/l/oldfile3

应该这样做:

cd dir
for file in *; do
    newpath="${file:0:1}/${file:1:1}"
    mkdir -p "$newpath"
    cp "$file" "$newpath"
done

不过请确保所有文件名都是两个或更多字符。

${var:n:m} 只是 Bash "substring of var starting at n of length m."

的语法

如果还可以有任意子目录,如果要递归复制,则将 -r 添加到 cp 命令,或者添加一个测试以忽略 for 循环中的目录:

cd dir
for file in *; do
    if [ -f "$file" ]; then
        newpath="${file:0:1}/${file:1:1}"
        mkdir -p "$newpath"
        cp "$file" "$newpath"
    fi
done