匹配没有扩展名的文件名,并将它们移动到新目录(如果找到匹配) - 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脚本只没有这样的文件或目录将具有匹配文件名(不包括扩展名)的文件移动到目标目录?

+0

目标目录是否存在? – 2012-03-12 13:51:30

+0

是的目标目录存在 - 我尝试使用“mv -v $ file $ Dest01”,并且所有文件都被移动到目标目录 – JRM 2012-03-12 13:53:30

+0

但是,您尝试使用扩展名剥离的文件名称来调用mv。可能没有这样的文件,我想这是导致错误的原因。所以,如果你有try.jpg你尝试执行'mv -v try〜/ dest'并且没有文件temp。 – 2012-03-12 13:58:37

我误解了原反应的问题,所以这里有一个更好的编辑:

#!/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 

这还不是最通用的解决方案,但它应该在这种情况下工作

+0

如果我这样做,它会将所有扩展名为* .mp4,* .jpg和* .xml的文件移动到目标目录中,而不管这些文件是否具有匹配的文件名。如果脚本具有匹配的文件名,则应该只移动名为* .xml,* .mp4,* .jpg的文件。 – JRM 2012-03-12 14:10:25

+0

它只会将XML文件移动到目标目录中 - 但是否则所有内容都是正确的 – JRM 2012-03-12 15:43:25

+0

它会采用平面文件夹结构。你在binaryDump目录下有嵌套的文件夹吗? – Alex 2012-03-12 17:33:01

所以,如果我得到了什么你的想法只想复制所有扩展名中存在的文件,即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 
+0

正确 - 是的,这是我想要的脚本。 - 让我试试你的例子。谢谢。 – JRM 2012-03-12 14:23:11

+0

我写这个的方式只有在三个文件都在同一个文件夹中时才会发生。如果你想获得别的东西,脚本将不得不被修改。 – 2012-03-12 14:32:54

+0

谢谢你 - 我会尝试并调整它,因为.mp4和.jpg文件将位于与.xml不同的目录中 – JRM 2012-03-12 14:53:43