有两个目录,一个包含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:将./xmlDump/test_002重命名为/ Volumes / VoigtKampff / Temp / TEST1 / destination / test_002:没有这样的文件或目录 mv:将./xmlDump/test_001重命名为/ Volumes / VoigtKampff / Temp / TEST1 / destination / test_001:没有这样的文件或目录 mv:将./binaryDump/test_003重命名为/ Volumes / VoigtKampff / Temp / TEST1 / destination / test_003:没有这样的文件或目录
如何让bash脚本只将具有匹配文件名(不包括扩展名)的文件移动到目标目录?
答案 0 :(得分:1)
我误解了原始回复中的问题,所以这是一个更好的编辑:
#!/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
这不是最通用的解决方案,但它应该适用于这种情况
答案 1 :(得分:1)
因此,如果我得到您的想法,您只想复制存在所有扩展名的文件,即A.jpg,A.mp4 AND 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