Macos 迭代文件夹并将文件上移一级
我的目录结构如下所示:Macos 迭代文件夹并将文件上移一级,macos,bash,shell,Macos,Bash,Shell,我的目录结构如下所示: /images /1 /.tmp image1.jpg image2.jpg /2 .tmp image1.jpg image2.jpg image3.jpg /3 .tmp image1.jpg image2.jpg 我需要的是将.tmp中的所有文件向上移动一级,使它们的路径是images/1/image1.jpg而不是images/1/.tmp/i
/images
/1
/.tmp
image1.jpg
image2.jpg
/2
.tmp
image1.jpg
image2.jpg
image3.jpg
/3
.tmp
image1.jpg
image2.jpg
我需要的是将.tmp中的所有文件向上移动一级,使它们的路径是images/1/image1.jpg
而不是images/1/.tmp/image1.jpg
。问题是,我有成百上千个这样编号的文件夹,所以手工操作会花费很长时间
是否有一个OS X或Unix shell命令,我可以迭代每个/.tmp文件夹并将内容向上移动一个级别,或者类似于:
mv images/*/.tmp/* images/< the current dir being iterated over>/*
mv-images/*/.tmp/*images/<正在迭代的当前目录>/*
无需测试即可从头开始:
cd /images
for i in $(find ./ -name *.jpg)
do
d = $(dirname $i)
d = $(dirname $d)
echo $i $d
# test! before use the next
# mv $i $d
done
如果您的
find
支持-execdir
命令(which),则可以执行以下操作:
find . -iname '*.jpg' -execdir mv {} .. \;
find . -type d -name .tmp -print0 | xargs -0I_ find _ -maxdepth 1 -name '*.jpg' -execdir mv {} .. \;
-execdir
从找到文件的目录运行命令,因此。
将引用该文件目录的父目录
您可以对此进行优化,以强制匹配.tmp
目录:
find . -path '*/.tmp/*.jpg' -execdir mv {} .. \;
但是,-path
中的*
也匹配/
,因此这也将匹配,例如,images/.tmp/foo/image.jpg
你可以做:
find . -iname '*.jpg' -execdir mv {} .. \;
find . -type d -name .tmp -print0 | xargs -0I_ find _ -maxdepth 1 -name '*.jpg' -execdir mv {} .. \;
或者,使用find
的正则表达式支持:
find . -regex '.*/\.tmp/[^/]*\.jpg' -execdir mv {} .. \;
是的,我刚刚意识到!我认为它只是将文件/路径当作是。这里唯一关心的是,如果目录中也有
*.jpg
文件不是.tmp
,您也会将它们移动到其他位置。你能调整它使其只影响位于.tmp
目录中的文件吗?@muru你可以使用正则表达式而不是路径或管道。@123 hmm,是-regex.*/\.tmp/[^/]*\.jpg'
应该足够了。谢谢提醒。千万不要这样做:用于$(command)
或命令
或$var
。for in用于迭代参数,而不是(输出)字符串。相反,可以使用glob(例如.*.txt)、数组(例如“${names[@]}”
)或while-read循环(例如while-r-line
)。请参阅并使用find
,使用read的方法是find…-print0 |而IFS=read-d'-ri;执行…