如何根据文件名将所有文件复制到子目录?
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
我确信 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