2015-01-10 3 views
0

На сервере есть сценарий, который мне нужно запустить во всех файлах в папке. Для того, чтобы запустить этот скрипт один файл, я использую этот скрипт:Сценарий, который выполняет итерацию по всем файлам в папке

for input in /home/arashsa/duo-bokmaal/Bokmaal/DUO_BM_28042.txt ; do 
    name=$(basename "$input") 
    /corpora/bokm/tools/The-Oslo-Bergen-Tagger/./tag-lbk.sh "$input" > "/home/arashsa/duo-bokmaal-obt/$name" 
done 

я ужасен в написании скриптов, так и не удалось выяснили, как перебирать файлы. Я хочу, чтобы сценарий перебирал все файлы в данной папке, заканчивающиеся на .txt, а не те, которые заканчиваются на _metadata.txt. Поэтому я думаю, что я хотел бы дать ему путь к папке в качестве аргумента, сделать его перебирать все файлы в этой папке и запустить скрипт на файлы, заканчивающиеся на .txt и не _metadata.txt

ответ

0

В Баш:

shopt -s extglob 

for input in /dir/goes/here/*!(_metadata).txt 
do 
    ... 
done 
+0

Как бы преобразовать это, чтобы каталог указывался как аргумент вместо hardcoded? Достаточно ли заменить знак доллара? –

1

Используйте опцию find и exec.

$ find /path/to/dir -exec <command here> \; 

Каждый файл или каталог может быть получен с помощью {}.

Пример использования: $ find . -exec echo {} \;, это будет эхо каждого имени файла рекурсивно или имя каталога в текущем каталоге. Вы можете использовать некоторые другие параметры, чтобы дополнительно указать нужные файлы и каталоги, которые вы хотите обработать. Я кратко объясню некоторые из них. Обратите внимание, что эхо избыточно, потому что вывод find будет автоматически распечатываться, но я оставлю его там, чтобы проиллюстрировать работу exec. Это, как говорится, следующие команды дают одинаковый результат: $ find . -exec echo {} \; и $ find .

maxdepth и mindepth Указание maxdepth и mindepth позволяет идти так глубоко вниз по структуре каталогов, как вам нравится. Maxdepth определяет, сколько раз find войдет в каталог, а mindepth определяет, сколько раз нужно вводить каталог перед выбором файла или каталога.

Примеры использования: (1) всего лишь элементов из этого списка, включая. (= текущий каталог). (2) перечисление только элементов из текущего каталога. (3) перечислив элементы из корневого каталога и все каталоги в этой директории

(1)$ find . -maxdepth 1 -exec echo {} \; 
(2)$ find . -mindepth 1 -maxdepth 1 -exec echo {} \; 
# or, alternatively 
(2)$ find . ! -path . -maxdepth 1 -exec echo {} \; 
(3)$ find/-maxdepth 2 -exec echo {} \; 

типа Задание опции типа позволяет фильтровать файлы или только каталоги, пример использования: (1) список всех файлов в этот dir (2) вызовите сценарий оболочки funtion func на каждую директорию в корневом каталоге.

(1)$ find . -maxdepth 1 -type f -exec echo {} \; 
(2)$ find/-maxdepth 1 -type d -exec func {} \; 

имя & регулярного выражения Опция Названия позволяет искать конкретные имена файлов, вы можете также искать файлы и директории с помощью регулярных выражений формата.

Пример использования: найти все фильмы в определенной директории

$ find /path/to/dir -maxdepth 1 -regextype sed -regex ".*\.\(avi\|mp4\|mkv\)" 

размер Другой фильтр размер файла, любой файл или реж больше, чем это значение будет возвращено. Пример использования: (1) найти все пустые файлы в текущем каталоге. (2) найти все непустые файлы в текущем каталоге.

(1)$ find . -maxdepth 1 -type f -size 0 
(2)$ find . -maxdepth 1 -type f ! -size 0 

Другие примеры Переместить все файлы текущей директории в директорию tmp, присутствующего в .

$ find . -type f -maxdepth 1 -exec mv {} tmp \; 

Преобразовать все MKV файлы в MP4 файлы в дир/путь/к/реж и ребенка справочники

$ find /path/to/dir -maxdepth 2 -regextype sed -regex ".*\.mkv" -exec ffmpeg -i {} -o {}.mp4 \; 

Конвертировать все ваши файлы jpeg в png (не делайте этого, это займет очень долго, чтобы найти их и преобразовать их).

$ find ~ -maxdepth 420 -regextype sed -regex '.*\.jpeg' -exec mogrify -format png {} \; 

Примечание find команда является мощным инструментом, и это может оказаться плодотворным для труб выход в xargs. Важно отметить, что этот метод превосходит следующую конструкцию:

for file in $(ls) 
do 
    some commands 
done, 

как последний будет обрабатывать файлы и каталоги, содержащие пробелы неправильный путь.

Смежные вопросы