bash:根据祖父目录名称重命名不确定的子子文件夹中的文件

时间:2015-01-08 17:25:46

标签: macos bash directory batch-rename

在这里猛击新手试图将文件夹的名称插入该文件夹中的某些文件。

问题是这些文件位于主目录的子文件夹的子文件夹中,每种级别的名称在每种情况下都不同。

例如,主文件夹interviews可能包含John Doe,而John Doe下的是Images目录,文件Screenshot.jpg。但也可能John Smith个文件夹Etc,其中12_Screenshot 2.jpg

我想在文件名前重命名包含ScreenshotJohn Doe的所有这些文件。

我尝试调整我发现的几个脚本并从John Smith目录运行它们:

interviews

之后终端给出了插入符号提示,好像我错过了什么。我也试过

for i in `ls -l | egrep '^d'| awk '{print $10}'`; do  find . -type f -name "*Screenshot*" -exec sh -c 'mv "$0" "${i}${0}"' '{}' \; done

返回find -regex '\./*' -type d -exec mv -- {}/*/*Screenshot* {}/{}.jpg \; -empty -delete

第二个理论上将文件移动到父文件夹的事实不是问题,因为我最终还是必须这样做。

2 个答案:

答案 0 :(得分:0)

对于当前工作目录中的每个目录,递归查找包含字符串“screenshot”的文件(由于OSX而不区分大小写)。将找到的路径拆分为父部分(始终至少以“./”形式出现)和文件名,生成两行一个原始文件路径,第二个原始文件夹+修改后的目标文件名。使用两个参数通过xargs执行mv命令(由换行符分隔以允许路径中的空格):

for i in `ls -l | sed -n '/^d\([^[:space:]]\+[[:space:]]\+\)\+\([^[:space:]]\+\)$/s//\2/p'`; do
    find "$i" -type f -iname "*Screenshot*" \
        | sed -n '\!^\(\([^/]\+/\)\+\)\([^/]\+\)$!s!!\1\3\n\1'$i'\3!p' \
        | xargs -d '\n' -n 2 mv;
done

缺点:OSX上的xargs不知道--no-run-if-empty,因此对于不包含带有“screenshot”字符串的文件的目录,将调用空mv。需要添加适当的选项(无法访问OSX手册页)或xargs ... 2>& / dev / null以忽略所有错误...

答案 1 :(得分:0)

以下脚本将按预期运行:

dir=$1
find $dir -name "*Screenshot*" -type f | while read file
do
    base=$(basename $file)
    dirpath=$(dirname $file)
    extr=$(echo $file | awk -F/ '{print $(NF-2)}') #extracts the grandparent directory
    mv $file $dirpath/$extr-$base
done

正如@loneswap所提到的,必须将其作为脚本调用。因此,如果您的主目录是mainDir,那么您将调用它...

./script mainDir