2013-09-30 2 views
1

Я хочу написать сценарий оболочки в Linux, который будет проходить через все каталоги и подкаталоги и котировать все текстовые файлы один раз. ниже - то, что я получил до сих пор, немного отставая от логики на этом. может кто-нибудь дать мне руку? благодаряLinux Shell Script Files и Directory Loop

сценарий принять 1 аргумент например: ./script.sh DirectoryName

#!/bin/bash 

echo "Directory $1" 

cd $1 
for f in *.txt 
do 
cat $f 
done 

им не знаете, как идти в подкаталоги отсюда, так как может быть бесконечное количество в каждом подкаталоге.

ответ

4

Использование find.

Если ваша операционная система поддерживает современную версию POSIX:

find "$1" -type f -name '*.txt' -exec cat '{}' + 

... или, если он не делает:

find "$1" -type f -name '*.txt' -exec cat '{}' ';' 

... или, если вы хотите быть неэффективен (или есть более интересный вариант использования вы не сказали нам о), и ваш find поддерживает -print0 ...

find "$1" -type f -name '*.txt' -print0 | \ 
    while IFS='' read -r -d '' filename; do 
    cat "$filename" 
    done 

Не оставляйте в стороне -print0 - иначе злонамеренные имена файлов (с символами новой строки в их именах) могут вставлять произвольные имена в ваш поток (в худшем случае) или скрываться от обработки (в лучшем случае).

+0

что есть печать0? – NewFile

+0

@NewFile, '-print0' NUL-ограничивает имена, а не ограничивает новую строку. –

+0

Имя папки? Find $ 1 -type -f -name '* .txt' -exec cat '{}' + –

2

Вы можете использовать find или рекурсию.

Пример использования рекурсии:

dump_files() 
{ 
    for f in $1/*; do 
     if [[ -f $f ]]; then 
      cat $f 
     elif [[ -d $f ]]; then 
      dump_files $f 
     fi 
    done 
} 
+0

Я сделал именно то, что вы пишете, но у меня возникла синтаксическая ошибка вокруг строки fi – NewFile

+0

Да, я написал синтаксическую ошибку, но @JohnKugelman исправил ее. –

0

цикл изменения с

for f in $(find . -name *.txt);do 
    cat $f 
done 
+0

-1; это активно вредно/создает ошибки. См. Http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29 (в дополнение к отсутствию цитаты при расширении) –

+0

та же проблема с исходным кодом: для f в * .txt – michael501

+0

Неверно. 'for f in * .txt' является безопасным. Прочтите связанную страницу. –

2
find . -name '*.txt' -print0 | xargs -0 cat 

Если вы хотите определенный каталог, замените . полный путь каталога. find получает файлы, которые заканчиваются расширением .txt, и передает его на xargs, который выполняет команду cat на них. -0 опция xargs принимает ввод буквально. -print0 способ подходит ...

+0

Если у вас есть достаточно современная находка для '-print0', почему бы не использовать форму' -exec {} + '(которая, как и xargs, также помещает как можно больше аргументов в каждую командную строку' cat')? –

+0

Не соглашайтесь с вами, @CharlesDuffy. Я поставил другой вариант, вот и все. – iamauser

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