Bash 重命名目录和(深度嵌套的)子目录中的所有文件
用于重命名目录和子目录中的所有文件(递归)的shell命令是什么 我想在所有目录和子目录中从Bash 重命名目录和(深度嵌套的)子目录中的所有文件,bash,shell,unix,Bash,Shell,Unix,用于重命名目录和子目录中的所有文件(递归)的shell命令是什么 我想在所有目录和子目录中从filename.scss到\u filename.scss以*scss结尾的所有文件中添加下划线 我已经找到了与此相关的答案,但大多数(如果不是全部的话)要求您了解文件名本身,我不想这样做,因为文件名不同,需要记住很多内容,甚至需要手动键入,而且其中一些文件在目录中嵌套得很深。编辑:我的印象是,bash-c位对于所找到的元素的多次扩展是必要的;阿努巴瓦的回答证明我错了。我现在在答案中留下这一点,因为它对
filename.scss
到\u filename.scss
以*scss
结尾的所有文件中添加下划线
我已经找到了与此相关的答案,但大多数(如果不是全部的话)要求您了解文件名本身,我不想这样做,因为文件名不同,需要记住很多内容,甚至需要手动键入,而且其中一些文件在目录中嵌套得很深。编辑:我的印象是,
bash-c
位对于所找到的元素的多次扩展是必要的;阿努巴瓦的回答证明我错了。我现在在答案中留下这一点,因为它对OP有效
find . -type f -name *scss -exec bash -c 'mv $1 _$1' -- {} \;
——在当前目录中查找(递归)查找。
--文件-类型f
--匹配模式-name*scss
*scss
——为找到的每个元素执行-exec
——在子shell中执行命令bash-c'…'
--结束选项解析--
——扩展到找到的元素的名称(它成为{}
命令的位置参数)bash-c
\代码>--结束
命令-exec
bash-c
位对于找到的元素的多次扩展是必需的;阿努巴瓦的回答证明我错了。我现在在答案中留下这一点,因为它对OP有效
find . -type f -name *scss -exec bash -c 'mv $1 _$1' -- {} \;
——在当前目录中查找(递归)查找。
--文件-类型f
--匹配模式-name*scss
*scss
——为找到的每个元素执行-exec
——在子shell中执行命令bash-c'…'
--结束选项解析--
——扩展到找到的元素的名称(它成为{}
命令的位置参数)bash-c
\代码>--结束
命令-exec
-execdir
选项:
find ./src/components -iname "*.scss" -execdir mv {} _{} \;
您可以在此处使用
-execdir
选项:
find ./src/components -iname "*.scss" -execdir mv {} _{} \;
您已接近解决方案:
find ./src/components -iname "*.scss" -print0 | xargs -0 -n 1 -I{} mv {} _{}
在这种方法中,“循环”由xargs执行。比起在find中使用-exec,我更喜欢这个解决方案。语法对我来说很清楚
此外,如果要重复该命令并避免在已处理的文件中重复添加下划线,请使用regexp仅获取尚未处理的文件:
find ./src/components -iregex ".*/[^_][^/]*\.scss" -print0 | xargs -0 -n 1 -I{} mv {} _{}
通过添加-print0/-0选项,您还可以避免出现空白问题。您已接近解决方案:
find ./src/components -iname "*.scss" -print0 | xargs -0 -n 1 -I{} mv {} _{}
#!/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
在这种方法中,“循环”由xargs执行。比起在find中使用-exec,我更喜欢这个解决方案。语法对我来说很清楚
此外,如果要重复该命令并避免在已处理的文件中重复添加下划线,请使用regexp仅获取尚未处理的文件:
find ./src/components -iregex ".*/[^_][^/]*\.scss" -print0 | xargs -0 -n 1 -I{} mv {} _{}
通过添加-print0/-0选项,您还可以避免出现空白问题。尝试使用loopFind进行查找在查找文件时效果很好,但在我想重命名查找到的文件(文件名未发出)时不起作用。我尝试了此
find./src/components-iname“*.scss”
这将获取文件,但如何获取每个文件名并在其上添加下划线?类似于find./src/components-iname“*.scss”|将每个文件名转换为_each-file-name
?另外,find,查找所有内容,因此不确定是否在循环中这会产生影响。尝试使用loopFind进行查找可以很好地查找文件,但当我想重命名找到的文件时(文件名未发出)将无法工作。我尝试了此find./src/components-iname“*.scss”
这将获取文件,但如何获取每个文件名并在其上添加下划线?类似于find./src/components-iname“*.scss”|将每个文件名转换为_each-file-name
?另外,find,查找所有内容,因此不确定这是否在循环中会产生影响。exec
或execdir
?超级!它工作了,但必须使用execdir
,因为我认为exec
不会在目录中执行。@brandNew:使用-exec
可以获得相对于源目录的元素的完整路径,即mv./foo/bar/baz.scss./foo/bar/_baz.scss
。使用-execdir
可以转到元素的子目录以执行命令,即mv baz.scss_baz.scss
。无论哪种方式都有效;find
的手册页建议使用后者。我承认直到现在我自己还不知道-execdir
。你生活和学习绝对地干杯。exec
或execdir
?超级!它工作了,但必须使用execdir
,因为我认为exec
不会在目录中执行。@brandNew:使用-exec
可以获得相对于源目录的元素的完整路径,即mv./foo/bar/baz.scss./foo/bar/_baz.scss
。使用-execdir
可以转到元素的子目录以执行命令,即mv baz.scss_baz.scss
。无论哪种方式都有效;find
的手册页建议使用后者。我承认直到现在我自己还不知道-execdir
。你生活和学习绝对地干杯。第一个答案奏效了。但这也很有用(本该有效),所以请投票!第一个答案奏效了。但这也很有用(本该有效),所以请投票!第一个答案奏效了。但这也很有用(本该有效),所以请投票!好啊现在我必须回溯一下,找出为什么我认为每个-exec只能有一个{}
#!/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