在这里猛击新手试图将文件夹的名称插入该文件夹中的某些文件。
问题是这些文件位于主目录的子文件夹的子文件夹中,每种级别的名称在每种情况下都不同。
例如,主文件夹interviews
可能包含John Doe
,而John Doe
下的是Images
目录,文件Screenshot.jpg
。但也可能John Smith
个文件夹Etc
,其中12_Screenshot 2.jpg
。
我想在文件名前重命名包含Screenshot
或John 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
第二个理论上将文件移动到父文件夹的事实不是问题,因为我最终还是必须这样做。
答案 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