Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos bash:根据祖父母目录名重命名不确定子文件夹中的文件_Macos_Bash_Directory_Batch Rename - Fatal编程技术网

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

Macos bash:根据祖父母目录名重命名不确定子文件夹中的文件,macos,bash,directory,batch-rename,Macos,Bash,Directory,Batch Rename,Bash新手试图将文件夹的名称插入该文件夹中的某些文件中 问题在于,这些文件位于主目录子文件夹的子文件夹中,并且在每种情况下,每个级别的名称都不同 例如,主文件夹访谈可能包含约翰·多伊,而约翰·多伊下是一个目录图像,其中包含一个文件屏幕截图.jpg。但是也可能有John Smith和一个文件夹Etc,其中是12_屏幕截图2.jpg 我想重命名所有包含屏幕截图的文件,在文件名之前插入John Doe或John Smith 我试着改编我找到的几个脚本,并从访谈目录中运行它们: for i in `l

Bash新手试图将文件夹的名称插入该文件夹中的某些文件中

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

例如,主文件夹
访谈
可能包含
约翰·多伊
,而
约翰·多伊
下是一个目录
图像
,其中包含一个文件
屏幕截图.jpg
。但是也可能有
John Smith
和一个文件夹
Etc
,其中是
12_屏幕截图2.jpg

我想重命名所有包含
屏幕截图
的文件,在文件名之前插入
John Doe
John Smith

我试着改编我找到的几个脚本,并从
访谈
目录中运行它们:

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
返回<代码>查找:非法选项--r


第二个从理论上讲,将文件上移到父文件夹并不是一个问题,因为我最终必须这样做。

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


缺点:OSX上的xargs不知道——如果为空,则不运行,因此对于不包含带有“屏幕截图”字符串的文件的目录,将调用empty mv。需要添加正确的选项(无法访问OSX手册页)或xargs。。。2> &/dev/null忽略所有错误…

以下脚本将根据需要工作:

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

所以你想要
采访/John Doe/images/Screenshot.jpg
->
采访/John Doe/images/John Doe Screenshot.jpg
?我想你可能错过了一个
在<代码>之后在第一次尝试中。但是无论如何,您不应该解析
ls
的输出。@MarcB完全正确@EtanReisner我尝试了
以$(ls)表示的I;一定要找到-键入f-name“*Screenshot*”-exec sh-c'mv“$0”“${i}${0}”''{}\;完成
。它执行但没有效果
i
在mv字符串中似乎为空。这是因为它在单引号中=否substitution@Ionewaspmv命令或括号?在我的例子(Ubuntu/bash)中,尝试用您的awk调用替换我的sed-after-egrepls-l给出的组件少于10个,我的目的是得到最后一个组件。还可以尝试在mv之前添加echo,查看将调用哪些命令replacing
sed'…'`
使用
awk'{print$10}`
我得到:
~/Desktop/interview/interview\u name~/Desktop/interview~/Desktop/test用法:mv[-f |-I |-n][v]源目标mv[-f |-I |-n][v]源。。。目录/桌面/采访/桌面/测试< /代码>带有回音,我在输出过程中得到行<代码> MV./Simult/TysStudioStudio12.jpg < /Cord>。路径中的任何白皮书返回错误:<代码>查找:非法选项-N< /代码>。这没有意义,因为它看起来很好。@fvogel您需要将其作为一个脚本调用,将目录的一个参数传递给process@lonewasp我应该仔细看看。工作起来很有魅力@Bolboa很好的解决方案!您能建议如何将重命名的文件移到新位置,同时保持原始文件不变吗?我想(重命名并复制到新位置):在第2行添加
dst=$1
,在最后一行添加
cp$dirpath/$extr-$base$dst
./script mainDir