匹配没有扩展名的文件名,并将它们移动到新目录(如果找到匹配) - Bash
问题描述:
有两个目录,一个包含XML,一个包含二进制文件(jpg和mp4)。我需要脚本来检查这两个目录,如果* .jpg,* .mp4和* .xml与文件名完全匹配 - 那么脚本需要将具有匹配名称的所有匹配文件移动到新目录。匹配没有扩展名的文件名,并将它们移动到新目录(如果找到匹配) - 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'
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到/卷/ VoigtKampff /温度/ TEST1 /目的/ test_002:没有这样的文件或目录 MV:重命名./xmlDump/test_001到/卷/ VoigtKampff /温度/ TEST1 /目的地/ test_001:没有这样的文件或目录 MV:重命名./binaryDump/test_003到/卷/ VoigtKampff /温度/ TEST1 /目的/ 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
目标目录是否存在? – 2012-03-12 13:51:30
是的目标目录存在 - 我尝试使用“mv -v $ file $ Dest01”,并且所有文件都被移动到目标目录 – JRM 2012-03-12 13:53:30
但是,您尝试使用扩展名剥离的文件名称来调用mv。可能没有这样的文件,我想这是导致错误的原因。所以,如果你有try.jpg你尝试执行'mv -v try〜/ dest'并且没有文件temp。 – 2012-03-12 13:58:37