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

时间:2018-07-18 08:26:01

标签: bash shell unix

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

我想在所有目录和子目录中的所有从*scssfilename.scss_filename.scss结尾的文件中添加下划线。

我已经找到了与此相关的答案,但是大多数(如果不是全部)都要求您知道文件名本身,并且我不希望这样做,因为文件名不同,并且很多时候都应该知道,甚至手动键入它们也有一些完全嵌套在目录中。

4 个答案:

答案 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