2012-03-12 134 views
0

有兩個目錄,一個包含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

回答

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 

這還不是最通用的解決方案,但它應該在這種情況下工作

+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

1

所以,如果我得到了什麼你的想法只想複製所有擴展名中存在的文件,即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

相關問題