有一些文件名包含问号'?',你知道windows对这样的字符有问题。我想使用xarg
递归地重命名文件夹中的所有文件。例如:
09 - grand hall?_10.mp3
应该是
09 - grand hall_10.mp3
for file in $(find 文件夹 -name '*.mp3'); do
mv -v "$file" $(echo "$file" | tr ? _);
done
上述代码存在空格问题; 下面的改写更好:
find 文件夹 -name '*.mp3' -exec echo "'{}'" \; |
while read file; do
echo -n "mv -v $file " && echo $file | tr ? _;
done | sh
代码的思路是先找到所有符合条件的文件,在将其用引号输出。再通过while
循环为每个文件构造一个mv
指令,最后将结果重定向到新的Shell中。
虽然看起来有些丑陋,但要是你不喜欢这个答案,那也就不该问这个问题了。 :-)
$file
中的一些空格问题,但是for file in $(find _folder_ -name '*.mp3')
仍然存在重新标记化的问题。你可以尝试基于find -print0
管道到read -d ''
的方法。 - je4dfile $(我的要运行的代码)name
"这样的文件名,您的管道sh将最终运行“我的要运行的代码”! - je4dsh
,那几乎总是一个坏主意。使用 find ... -print0
以 null 字节分隔打印文件名。然后将其管道传递给 while read -d '' filename; do ...; done
循环。-d ''
使 read
使用 null 字节分隔。 - je4d这个看起来非常丑陋,但我把它当作一个个人挑战来完成一行代码的工作。 :-)
find 文件夹 -name '*.mp3' -exec \
sh -c "echo -n 'mv \"{}\" ' && echo \'{}\' | tr ? _" \; | sh
策略是找到文件,并使用echo
构造每个文件的mv
命令及其名称的引用符,然后将输出导入到shell。
(IFS=\0;find . -name \*\\?\* -type f -print0| while read -d '' f;do mv -v $f $(echo $f|tr -d \?);done)
解释:
find
只搜索文件名包含 '?' 的文件。\0
设置为 IFS
的分隔符,find
(通过 -print0
)和 read
(通过 -d ''
)可以处理包含特殊字符的文件名,如单引号、双引号、空格等。IFS
不变。.
可以替换为任何其他目录。
xarg
吗? - Shep?
字符? - Shep