我将一个简单的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脚本,但仍然是新的。任何帮助或示例都非常感谢!
答案 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