2012-12-19 63 views
5

我正在尋找一種方法來遞歸遍歷目錄以找到特定的文件,然後停止搜索和管道文件名路徑到awk函數或類似的東西。 I asked a question earlier that was similar,但在除了我的機器之外的其他機器上測試後發現locate命令不起作用,因爲不是每個人都在他們的系統上使用它。我所使用找到一個特定的文件,然後管道輸出到標準輸出/ awk

碼定位:

dir="/path/to/destination/"; 
mkdir "$dir"; 
locate -l 1 target_file.txt | \ 
    awk -v dir="$dir" '{printf "cp \"%s\" \"%s\"\n", $1, dir}' | \ 
    sh 
+0

你可以使用查找,而不是找到 – Heisenbug

+0

@ Heisenbug - 我想到了這一點,但無法真正找到特定的東西想找到一個文件。我會像使用'locate'一樣使用它嗎?謝謝 –

回答

6

find(1)命令將做到這一點。要僅獲得一條線,請使用head(1)

dir="/path/to/destination/"; 
mkdir "$dir"; 
find /path/location -name target_file.txt | 
    head -n 1 | 
    awk -v dir="$dir" '{printf "cp \"%s\" \"%s\"\n", $1, dir}' | 
    sh 
+0

很好 - 雖然有一個問題;因爲找到或多或少找到文件,而不指定起始目錄我怎麼會實現這個與你的例子?即從'/ path/location /'開始搜索# –

+0

@SamOlde將'.'改爲'/ path/location'。我編輯了答案來表明這一點。 – kmkaplan

+0

- 完美的作品!非常感謝:) –

1

如果你知道那麼只有一個文件存在,你可以使用

find ./ -name "target_file.txt" -exec cp -r {} $dir \;

如果你不知道,用頭限制1和使用xargs的

find ./ -name "target_file.txt" | head -1 | xargs -I {} cp -r {} $dir/

+0

我知道存在多個文件,雖然我只想得到第一個找到的結果。感謝這些例子;我希望查找速度與'locate'一樣快: -/ –

+0

通過添加額外的開關可以快速查找。例如,如果您知道該文件不會超過兩個dir級別,則可以添加-maxdepth 2,還可以通過使用-type f將find限制爲僅搜索文件。因此,在所有你可以嘗試找到./ -name「target_file.txt」-type f -maxdepth 2 |頭-1 | xargs -I {} cp -r {} $ dir/ –

+0

確實有很好的信息;即使使用開關,它仍然沒有我想要的那麼快。我很感激你花時間提及你有什麼。 :) –

相關問題