bash ~ для цикла по определенным файлам в каталоге

19

В каталоге у вас есть несколько файлов - .txt , .sh , а затем планируйте файлы без модификатора .foo .

Если вы ls каталога:

blah.txt
blah.sh
blah
blahs

Как я могу указать for-loop использовать файлы без изменения .foo ? Итак, «делайте вещи» на файлах blah и blahs в приведенном выше примере.

Основной синтаксис:

#!/bin/bash
FILES=/home/shep/Desktop/test/*

for f in $FILES
do
    XYZ functions
done

Как вы видите, это эффективно перекрывает все в каталоге. Как я могу исключить .sh , .txt или любой другой модификатор?

Я играл с некоторыми операторами if, но мне действительно интересно, могу ли я выбрать для этих не модифицированных файлов.

Также может кто-то сказать мне правильный жаргон для этих текстовых файлов без .txt?

    
задан jon_shep 12.02.2013 в 02:02
источник

3 ответа

30
#!/bin/bash
FILES=/home/shep/Desktop/test/*

for f in $FILES
do
if [[ "$f" != *\.* ]]
then
  DO STUFF
fi
done
    
ответ дан David Kiger 12.02.2013 в 02:10
источник
  • Это работает для меня в измененной форме. Некоторые из моих имен файлов содержат «.», Поэтому используйте \. все еще могут выбрать их. Что такое fi, используемое для вашего кода? Спасибо! –  jon_shep 13.02.2013 в 19:01
  • Это просто endif для bash (если назад). –  David Kiger 13.02.2013 в 19:09
  • hmm, поэтому было бы сделано «сделано», чтобы закрыть оператор if. Хорошо, спасибо. –  jon_shep 13.02.2013 в 19:21
  • Тесты файлов лучше выполняются так, как будто [-f "$ f"] –  parvus 02.09.2017 в 12:55
10

Если вы хотите, чтобы это было немного сложнее, вы можете использовать команду find.

Для текущего каталога:

for i in 'find . -type f -regex \.\/[A-Za-z0-9]*'
do
WHAT U WANT DONE
done

объяснение:

find . -> starts find in the current dir
-type f -> find only files
-regex -> use a regular expression
\.\/[A-Za-z0-9]* -> thats the expression, this matches all files which starts with ./
(because we start in the current dir all files starts with this) and has only chars
and numbers in the filename.

Ссылка

    
ответ дан chris2k 18.08.2014 в 23:55
источник
  • Хороший материал! Я еще не использовал эту команду –  jon_shep 21.08.2014 в 07:13
1

Можно использовать отрицательные подстановочные знаки? для их фильтрации:

$ ls -1
a.txt
b.txt
c.png
d.py
$ ls -1 !(*.txt)
c.png
d.py
$ ls -1 !(*.txt|*.py)
c.png
    
ответ дан Blender 12.02.2013 в 02:05
источник
  • Хорошо, но скажу, что у меня есть каталог с более чем двумя из них. Есть ли логичный способ сделать bash сделать это для меня? Так что он может применяться на большинстве каталогов при работе одинаково. –  jon_shep 12.02.2013 в 02:09
  • @jon_shep: Более двух из них? –  Blender 12.02.2013 в 02:09
  • расширения файлов. В вашем примере вам пришлось вручную исключить их. –  jon_shep 12.02.2013 в 02:11
  • @Blender - это POSIX? –  wRAR 12.02.2013 в 02:24
  • ! (*. *), и нет, это не POSIX. –  that other guy 12.02.2013 в 02:27