/ / Skrypt Bash, aby znaleźć pliki w folderach - python, bash, shell

Skrypt Bash do znajdowania plików w folderach - python, bash, shell

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 № 1

The 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łaj find
  • /path/to/Main - Katalog, w którym chcesz rozpocząć wyszukiwanie. Domyślnie find 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 z find 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


0 dla odpowiedzi № 3
find . -name *.txt | xargs python2.7 ../getDOC.py