Mam kilka folderów jako
Main/
/a
/b
/c
..
Muszę przekazać plik wejściowy abc1.txt
, abc2.txt
z każdego z tych folderów odpowiednio jako plik wejściowy do mojego programu Pythona. Skrypt jest teraz,
for i in `cat file.list`
do
echo $i
cd $i
#works on the assumption that there is only one .txt file
inputfile=`ls | grep .txt`
echo $inputfile
python2.7 ../getDOC.py $inputfile
sleep 10
cd ..
done
echo "Script executed successfully"
Chcę więc, aby skrypt działał poprawnie, niezależnie od liczby plików .txt.
Czy ktoś może mi powiedzieć, czy istnieje jakieś wbudowane polecenie w powłoce, aby pobrać poprawne pliki .txt w przypadku wielu plików .txt?
Odpowiedzi:
3 dla odpowiedzi № 1The find
polecenie jest do tego odpowiednie -exec
:
find /path/to/Main -type f -name "*.txt" -exec python2.7 ../getDOC.py {} ; -exec sleep 10 ;
Wyjaśnienie:
find
- wołajfind
/path/to/Main
- Katalog, w którym chcesz rozpocząć wyszukiwanie. Domyślniefind
przeszukuje rekurencyjnie.-type f
- Rozważ tylko pliki (w przeciwieństwie do katalogów itp.)-name "*.txt"
- Znajdź tylko pliki za pomocą.txt
rozbudowa. Jest to cytowane, więc bash nie rozszerza automatycznie symbolu wieloznacznego*
przez globbing.-exec ... ;
- Dla każdego znalezionego takiego wyniku uruchom następujące polecenie:python2.7 ../getDOC.py {};
-{}
część to wynik wyszukiwania zfind
zostaje zastąpiony za każdym razem.sleep 10
- uśpienie na 10 sekund po każdym uruchomieniu skryptu Pythona na pliku. Usuń to, jeśli nie chcesz spać.
1 dla odpowiedzi nr 2
Lepiej używać globs :
shopt -s globstar nullglob
for i in Main/**/*txt; do
python2.7 ../getDOC.py "$i"
sleep 10
done
Ten przykład jest rekurencyjny i wymaga bash4
0 dla odpowiedzi № 3
find . -name *.txt | xargs python2.7 ../getDOC.py