我试图将名为f ##。txt(#being a digit 0-9)的文本文件组织到目录中,使它们最终成为d#/ f#.txt。
#! /bin/bash
for i in {0..9} ;
do
mkdir -p "$1/d$i "
for j in {0..9};
do
FILE= "/$1/f$i$j.txt"
if [ -f FILE ];
then
echo 'Moving!'
mv "/$1/f$i$j.txt" "/$1/d$i/f$j.txt"
fi
done
done
上面的代码是我到目前为止,但我一直收到错误:
CO1101/OSN2/q4-arrange.sh: line 8: /test/f00.txt: No such file or directory
我无法弄清楚我哪里出错了。
测试目录位于当前工作目录中
你可以尝试这样的事情:
#!/usr/bin/env bash
pref=f ext=txt
for f in "$pref"[0-9][0-9]."$ext"; do
num=${f#"$pref"} num=${num%."$ext"}
dir=d${num%?} file=$pref${num#?}.$ext
[[ -d $dir ]] || mkdir -- "$dir" || exit 1
mv -- "$f" "$dir/$file"
done
测试运行:
$ tree
.
├── f11.txt
├── f14.txt
├── f28.txt
├── f30.txt
└── script
$ ./script
$ tree
.
├── d1
│ ├── f1.txt
│ └── f4.txt
├── d2
│ └── f8.txt
├── d3
│ └── f0.txt
└── script
看起来你在FILE =和“/$1/f$i$j.txt”之间有一个空格。尝试删除空间,看看会发生什么。 Bash不喜欢变量赋值中的空格(即等号周围)。
希望这可以帮助。
如果你有rename
实用程序 - 也称为Perl重命名,你可以使用这个相当简洁的命令:
rename --dry-run -p 's|f([0-9])([0-9])|d$1/f$2|' *txt
样本输出
'f11.txt' would be renamed to 'd1/f1.txt'
'f14.txt' would be renamed to 'd1/f4.txt'
'f28.txt' would be renamed to 'd2/f8.txt'
'f30.txt' would be renamed to 'd3/f0.txt'
请参阅有关如何在各种发行版中调用包的注释here。
如果有人在macOS上,你可以用homebrew安装它:
brew install rename