有两个目录,一个包含XML,另一个包含二进制文件(jpg和mp4)。我需要脚本来检查这两个目录,如果*.jpg、*.mp4和*.xml在文件名上完全匹配,那么脚本需要将所有具有匹配名称的匹配文件移动到新目录。
#!/bin/bash
#File Origin
xmlDump='/Volumes/VoigtKampff/Temp/TEST2/xmlDump'
binaryDump='/Volumes/VoigtKampff/Temp/TEST2/binaryDump'
Dest01='/Volumes/VoigtKampff/Temp/TEST1/destination'
TopLevel='/Volumes/VoigtKampff/Temp/TEST2'
cd $TopLevel
for file in `find . -type f -name "*.xml" -or -name "*.jpg" -or -name "*.mp4"`
do
echo $file
if [ -f $file ] ; then
baseName=${file%.*}
if [ $baseName=${file%.*} ] ; then
echo $baseName
echo "success"
mv -v $baseName $Dest01
fi
fi
done
但我遇到的问题是将文件mv到目标目录。所以目前我得到的错误是,它试图在没有扩展名的情况下将文件mv到目标目录。
mv:重命名/xml转储/test_002到/Volumes/VoigtKamff/Temp/TEST1/destination/test_002:没有这样的文件或目录mv:重命名/xml转储/test_001到/Volumes/VoigtKamff/Temp/TEST1/destination/test_001:没有这样的文件或目录mv:重命名/binaryDump/test_003到/Volumes/VoigtKamff/Temp/TEST1/destination/test_003:没有这样的文件或目录
如何让bash脚本只将具有匹配文件名(不包括扩展名)的文件移动到目标目录?
我误解了原始回复中的问题,所以这里有一个更好的编辑:
#!/bin/bash
#File Origin
xmlDump='/Volumes/VoigtKampff/Temp/TEST2/xmlDump'
binaryDump='/Volumes/VoigtKampff/Temp/TEST2/binaryDump'
Dest01='/Volumes/VoigtKampff/Temp/TEST1/destination'
TopLevel='/Volumes/VoigtKampff/Temp/TEST2'
#don't cd into the directory, search in it from the root directory instead
#cd $TopLevel
for file in `find $TopLevel -type f -name "*.xml" -or -name "*.jpg" -or -name "*.mp4"`
do
echo $file
if [ -f $file ] ; then
file_name=$(basename $file)
basename=${file_name%.*}
if [ -f "$binaryDump/$basename.jpg" -a -f "$xmlDump/$basename.xml" -a -f "$binaryDump/$basename.mp4" ]
then
echo "success, basename: $basename, full file name: $file"
to_delete="$file $to_delete"
cp -v $file $Dest01
fi
fi
done
rm -v $to_delete
这不是最通用的解决方案,但在这种情况下应该可以使用
所以,如果我明白你的想法,你只想复制所有扩展名都存在的文件,即有a.jpg、a.mp4和a.xml。如果这是你的问题,这里是如何做到的:
#!/bin/bash
#File Origin
xmlDump='/Volumes/VoigtKampff/Temp/TEST2/xmlDump'
binaryDump='/Volumes/VoigtKampff/Temp/TEST2/binaryDump'
Dest01='/Volumes/VoigtKampff/Temp/TEST1/destination'
TopLevel='/Volumes/VoigtKampff/Temp/TEST2'
cd $TopLevel
for file in `find . -type f -name "*.xml" -or -name "*.jpg" -or -name "*.mp4"`
do
echo $file
if [ -f $file ] ; then
baseName=${file%.*}
if [ -a "$basename.jpg" ] && [ -a "$basename.xml" ] && [ -a "$basename.mp4" ] ; then
echo $baseName
echo "success"
mv -v $file $Dest01
fi
fi
done