2015-10-07 29 views
0

我有一個包含這樣的文件列表的文本文件複製文件(從列表)一個目錄(和它的子目錄)來查找每個文件並將其複製到另一個目錄中。任何子目錄

當前目錄: -dir -subdir1 -subdir2 -subdir3 -subdir4 -outputdir

在這個例子中,我可能:

  • subdir3
  • 找到 file1.txt
  • 找到file2.txtsubdir1
  • file3.txt可能不存在

在這種情況下,它會複製file1.txt & file2.txtoutputdir

我沒有太多的經驗,將在命令行上這樣做,但有1200文件移動,所以我不能手動執行。這是我已經得到了正確的事情最接近的事情,但沒有找到任何文件,因爲他們都在子目錄:

xargs -a list.txt cp -t outputdir 

你給也將是非常有幫助的命令的說明。搜索各地也提出了「for循環bash的」,我嘗試使用,但無法弄清楚所有的複雜性:

FOR /R "%~dp0" %%I IN (.) DO for /f "usebackq delims=" %%a in ("%~dp0list.txt") do echo d |xcopy "%%I\%%a" "outputdir" /e /i 
+1

你的問題的一部分是最後一點不是'bash' :) – chepner

回答

0

如果你有bash 4,使用以下命令:

shopt -s globstar nullglob 
while IFS= read -r fname; do 
    files=("$dir"/**/"$fname") 
    if ((${#files[@]} > 0)); then 
     cp "${files[@]}" "$outputdir" 
    fi 
done < list.txt 

while循環從list.txt一次讀取一行。 **模式匹配零個或多個目錄; files可能包含0個或更多匹配文件。如果該數組不爲空,則將所有文件名傳遞給cp進行復制。

對於舊版本,使用find

while IFS= read -r fname; do 
    find "$dir" -name "$fname" -type f -exec cp {} "$outputdir" \; 
done < list.txt 

這只是定位$dir下的所有匹配的文件,並運行在每個cp

+0

似乎工作,但我得到的錯誤,可能需要調整代碼。你能解釋一下這些代碼嗎,這樣我就可以解決我真正的問題了嗎? –