递归查找目录并在Shell脚本中重命名

时间:2018-02-09 23:47:30

标签: linux bash shell

我将一个简单的Shell脚本放在Linux机器上运行,我将:

1)查找主目录中的特定子目录。这些子目录具有非常特定的命名约定(见下文),它们总是在主目录下方2 -max深度。

2)将这些子目录重命名为其原始名称的PART。

例如, 子目录名为:

andrew-11111
andrew-11112
andrew-11113
andrew-11114

到达这些子目录的路径看起来像这样:

myphotos/sailing/photos/andrew-1111
myphotos/sailing/photos/andrew-1112
myphotos/biking/photos/andrew-1113
myphotos/hiking/photos/andrew-1114

我喜欢拿出' andrew - '来自每个子目录:

myphotos/sailing/photos/1111
myphotos/sailing/photos/1112
myphotos/biking/photos/1113
myphotos/hiking/photos/1114

我已经找到"发现"子目录并列出它们。我也了解如何在命令行中复制和重命名。但是在我的shell脚本知识水平上把它放在一起所花费的时间比我能承受的要多得多。只是一个免责声明,我非常愿意学习,并编写了一些shell脚本,但仍然是新的。任何帮助或示例都非常感谢!

2 个答案:

答案 0 :(得分:4)

使用通配符匹配嵌套目录中的文件

您可以使用bash parameter expansion运算符来操作文件名。

for file in myphotos/*/photos/*; do
    name=${file##*/}    # remove everything up to last /
    dir=${file%/*}      # remove everything from last /
    newname=${name##*-} # remove everything up to last -
    mv "$file" "$dir/$newname"
done

如果你有基于perl的rename命令,你可以这样做:

rename 's#[^/]*-##' myphotos/*/photos/*

答案 1 :(得分:2)

你可以用这个单行代码来完成:

find -type d -name andrew\* -exec sh -c 'mv {} $(dirname {})/$(basename {} | cut -d"-" -f2)' \;

说明:

  • -type d仅查找目录
  • -name andrew\*自我解释,你必须逃脱*虽然
  • -exec sh -c '...'在子shell中执行它,因此您可以毫无问题地执行命令替换($(...)
  • mv {} {}包含find找到
  • 的内容
  • dirname为您提供目录的路径(尝试使用随机路径,我的英语现在太糟糕了,无法更好地解释)
  • basename为您提供给定路径的最后一个目录
  • cut -d"-" -f2使用cut来切断" andrew - "。为此,将分隔符设置为-并选择字段编号2