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;执行…