2012-12-19 14 views
5

Poszukuję sposobu na przechodzenie przez rekursywne katalogi, aby znaleźć określony plik, a następnie zatrzymanie wyszukiwania i potokowanie ścieżki pliku do funkcji awk lub coś podobnego. I asked a question earlier that was similar, ale po testowaniu na maszynach innych niż moje okazuje się, że polecenie locate nie będzie działać, ponieważ nie wszyscy używają go w swoim systemie.Znajdź konkretny plik, a następnie potokuj do stdout/awk

Kod, który kiedyś z zlokalizować:

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

możesz użyć find zamiast zlokalizować – Heisenbug

+0

@Heisenbug - Myślałem o tym, ale nie mogłem znaleźć czegoś, co było speci fic do znalezienia jednego pliku. Czy użyłbym go w taki sam sposób jak w 'locate'? dzięki –

Odpowiedz

6

Komenda find(1) to zrobi. Aby uzyskać tylko jedną linię, użyj 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

nice - jedno pytanie; ponieważ zlokalizuj więcej lub mniej znajduje plik bez określenia katalogu początkowego, w jaki sposób osiągnąć to z twoim przykładem? tj. rozpocząć wyszukiwanie w '/ path/location /' –

+0

@SamOlde Zmieniasz '.' na'/path/location'. Poprawiłem odpowiedź, aby to pokazać. – kmkaplan

+0

- działa idealnie! bardzo dziękuję :) –

1

Jeśli znasz tylko jeden plik istnieje to można użyć

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

A jeśli nie jesteś pewien, korzystanie głowa do ograniczenia 1 i użyć xargs

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

+0

Wiem, że istnieje więcej niż jeden plik, chociaż chcę tylko uzyskać wynik pierwszego znalezionego. Dzięki za przykłady; Żałuję, że znalezisko nie było tak szybkie, jak 'locate': -/ –

+0

Można szybko znaleźć szukanie, dodając dodatkowe przełączniki. Na przykład, jeśli wiesz, że plik nie będzie miał więcej niż dwa poziomy dir, możesz dodać -maxdepth 2, a także ograniczyć wyszukiwanie do wyszukiwania tylko pliku przy użyciu -type f. Więc w Wszystko możesz spróbować znaleźć ./ -name "target_file.txt" -type f -maxdepth 2 | głowa -1 | xargs -I {} cp -r {} $ dir/ –

+0

dobre informacje na pewno; nawet przy przełącznikach nadal nie jest tak szybko, jak bym chciał. Doceniam, że poświęciłeś czas, by wspomnieć o tym, co masz. :) –

Powiązane problemy