匹配不带扩展名的文件名,如果找到匹配,则将其移动到新目录-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到目标目录。

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 

最新更新