我有一个像这样的文件夹结构: 一个名为Photos的大型父文件夹。此文件夹包含900多个名为a_000,a_001,a_002等的子文件夹。
每个子文件夹都包含更多子文件夹,名为dir_001,dir_002等。每个子文件夹都包含大量图片(具有唯一名称)。
我想将a_xxx子目录中包含的所有这些图片移到a_xxx中。 (其中xxx可以是001,002等)
在查看类似的问题之后,这是我提出的最接近的解决方案:
for file in *; do
if [ -d $file ]; then
cd $file; mv * ./; cd ..;
fi
done
我得到的另一个解决方案是执行bash脚本:
#!/bin/bash
dir1="/path/to/photos/"
subs= `ls $dir1`
for i in $subs; do
mv $dir1/$i/*/* $dir1/$i/
done
不过,我错过了什么,你能帮忙吗?
(然后丢弃空的dir_yyy会很好,但目前没有太多问题)
答案 0 :(得分:2)
您可以尝试以下bash脚本:
#!/bin/bash
#needed in case we have empty folders
shopt -s nullglob
#we must write the full path here (no ~ character)
target="/path/to/photos"
#we use a glob to list the folders. parsing the output of ls is baaaaaaaddd !!!!
#for every folder in our photo folder ...
for dir in "$target"/*/
do
#we list the subdirectories ...
for sub in "$dir"/*/
do
#and we move the content of the subdirectories to the parent
mv "$sub"/* "$dir"
#if you want to remove subdirectories once the copy is done, uncoment the next line
#rm -r "$sub"
done
done
答案 1 :(得分:1)
在以下脚本中确保文件所在的目录是正确的(并完成)并尝试:
#!/bin/bash
BigParentDir=Photos
for subdir in "$BigParentDir"/*/; do # Select the a_001, a_002 subdirs
for ssdir in "$subdir"/*/; do # Select dir_001, … sub-subdirs
for f in "$ssdir"/*; do # Select the files to move
if [[ -f $f ]]; do # if indeed are files
echo \
mv "$ssdir"/* "$subdir"/ # Move the files.
fi
done
done
done
不会移动任何文件,只需打印即可。如果您确定该脚本可以执行您想要的操作,请对回显线进行注释并“以实际”方式运行它。
答案 2 :(得分:1)
你可以试试这个
#!/bin/bash
dir1="/path/to/photos/"
subs= `ls $dir1`
cp /dev/null /tmp/newscript.sh
for i in $subs; do
find $dir1/$i -type f -exec echo mv \'\{\}\' $dir1/$i \; >> /tmp/newscript.sh
done
然后使用编辑器或/tmp/newscript.sh
打开less
,看看你的样子是否正常。
如果确实如此,则使用sh -x /tmp/newscript.sh