我有以下命令,我运行小写文件/目录,替换。用_和各种其他操作。它的问题是它似乎首先尝试重命名目录,然后它找不到它下面的文件。有没有办法重命名目录中的所有文件然后递归地重命名目录本身? e.g。
我的代码是
while IFS= read -rd '' entry; do
entry="${entry#./}" # strip ./
if [[ -d $entry ]]; then
rename 'y/A-Z/a-z/; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry"
else
rename 'y/A-Z/a-z/; s/\.(?=.*\.)/_/g; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry"
fi
done < <(find . -iname '*' -print0)
答案 0 :(得分:0)
以下是使用递归的示例UNTESTED代码:
recurse()
{
for entry in "$1"/*; do
entry="${entry#./}" # strip ./
if [[ -d $entry ]]; then
recurse $entry
rename 'y/A-Z/a-z/; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry"
else
rename 'y/A-Z/a-z/; s/\.(?=.*\.)/_/g; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry"
fi
done
}
recurse "/home"
答案 1 :(得分:0)
你看过this answer? 你的场景更复杂,但看起来他们在递归方面遇到了同样的困难。
答案 2 :(得分:0)
我正想着这条路上的东西:
find /path |awk -F/ '{print NF,$0}' |sort -r -n -k 1 |cut -f2- -d' ' |\
while IFS= read -rd '' entry; do
# ...
done
这个想法是在每行前面加上/
的数字,然后根据这个字段反向排序:
4 / path / dir1 / file1
4 / path / dir2 / file2
3 / path / dir1
3 / path / dir2
2 /路径
然后切掉第一列。这样,您可以自下而上地处理条目,以避免重命名问题。