Bash 重命名目录和(深度嵌套的)子目录中的所有文件

Bash 重命名目录和(深度嵌套的)子目录中的所有文件,bash,shell,unix,Bash,Shell,Unix,用于重命名目录和子目录中的所有文件(递归)的shell命令是什么 我想在所有目录和子目录中从filename.scss到\u filename.scss以*scss结尾的所有文件中添加下划线 我已经找到了与此相关的答案,但大多数(如果不是全部的话)要求您了解文件名本身,我不想这样做,因为文件名不同,需要记住很多内容,甚至需要手动键入,而且其中一些文件在目录中嵌套得很深。编辑:我的印象是,bash-c位对于所找到的元素的多次扩展是必要的;阿努巴瓦的回答证明我错了。我现在在答案中留下这一点,因为它对

用于重命名目录和子目录中的所有文件(递归)的shell命令是什么

我想在所有目录和子目录中从
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
    ——为找到的每个元素执行
  • bash-c'…'
    ——在子shell中执行命令
  • --
    --结束选项解析
  • {}
    ——扩展到找到的元素的名称(它成为
    bash-c
    命令的位置参数)
  • \--结束
    -exec
    命令

编辑:我的印象是,
bash-c
位对于找到的元素的多次扩展是必需的;阿努巴瓦的回答证明我错了。我现在在答案中留下这一点,因为它对OP有效

find . -type f -name *scss -exec bash -c 'mv $1 _$1' -- {} \;
  • 查找。
    ——在当前目录中查找(递归)
  • -类型f
    --文件
  • -name*scss
    --匹配模式
    *scss
  • -exec
    ——为找到的每个元素执行
  • bash-c'…'
    ——在子shell中执行命令
  • --
    --结束选项解析
  • {}
    ——扩展到找到的元素的名称(它成为
    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