用于重命名目录和子目录中的所有文件的shell命令是什么?
我想在所有目录和子目录中的所有从*scss
到filename.scss
以_filename.scss
结尾的文件中添加下划线。
我已经找到了与此相关的答案,但是大多数(如果不是全部)都要求您知道文件名本身,并且我不希望这样做,因为文件名不同,并且很多时候都应该知道,甚至手动键入它们也有一些完全嵌套在目录中。
答案 0 :(得分:1)
编辑:我的印象是bash -c
位对于找到的元素的多次扩展是某种必需的; anubhava的回答证明了我错了。我将它暂时留在答案中,因为它适用于OP。
find . -type f -name *scss -exec bash -c 'mv $1 _$1' -- {} \;
find .
-在当前目录中查找(递归)-type f
-文件-name *scss
-匹配模式*scss
-exec
-对找到的每个元素执行bash -c '...'
-在子shell中执行命令--
-结束选项解析{}
-扩展为找到的元素的名称(它成为bash -c
命令的位置参数)\;
-结束-exec
命令答案 1 :(得分:1)
您可以在此处使用-execdir
选项:
find ./src/components -iname "*.scss" -execdir mv {} _{} \;
答案 2 :(得分:1)
您已接近解决方案:
find ./src/components -iname "*.scss" -print0 | xargs -0 -n 1 -I{} mv {} _{}
在这种方法中,“循环”由xargs执行。我更喜欢此解决方案,而不要在find中使用-exec。语法对我来说很清楚。
此外,如果您想重复此命令并避免在已处理的文件中添加下划线,请使用正则表达式仅获取尚未处理的文件:
find ./src/components -iregex ".*/[^_][^/]*\.scss" -print0 | xargs -0 -n 1 -I{} mv {} _{}
通过添加-print0 / -0选项,还可以避免空格问题。
答案 3 :(得分:0)
#!/bin/sh
EXTENSION='.scss'
cd YOURDIR
find . -type f | while read -r LINE; do
FILE="$( basename "$LINE" )"
case "$LINE" in
*"$EXTENSION")
DIRNAME="$( dirname "$LINE" )"
mv -v "$DIRNAME/$FILE" "$DIRNAME/_$FILE"
;;
esac
done