匹配没有扩展名的文件名,如果找到匹配则将其移动到新目录 - Bash

时间:2012-03-12 13:46:34

标签: bash

有两个目录,一个包含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脚本只将具有匹配文件名(不包括扩展名)的文件移动到目标目录?

2 个答案:

答案 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