我正在尝试将名称为f ##。txt(#为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
我不知道哪里出了问题。
测试目录位于当前工作目录内
答案 0 :(得分:1)
似乎您在FILE =和“ /$1/f$i$j.txt”之间有一个空格。尝试删除空间,然后看看会发生什么。 Bash不喜欢变量分配中的空格(即等号周围)。
希望这会有所帮助。
答案 1 :(得分:0)
您可以尝试这样的事情:
#!/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
答案 2 :(得分:0)
如果您拥有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 上,则可以使用以下命令通过自制软件安装它:
brew install rename