2010-11-10 7 views
14

Как я могу выполнить определенную команду для каждого файла/папки в текущей папке?Выполнение команды для каждого файла в текущем каталоге

Я начал с этого в качестве базового скрипта, но это кажется, что он работает только при использовании временных файлов, и мне не очень нравится ideea. Есть ли другой путь?

FOLDER="."; 
DIRS=`ls -1 "$FOLDER">/tmp/DIRS`; 

echo >"/tmp/DIRS1"; 
while read line ; do 
    SIZE=`du "$FOLDER$line"`; 
    echo $SIZE>>"/tmp/DIRS1"; 
done < "/tmp/DIRS"; 

Для тех, кто заинтересован, я хотел бы сделать список папок, отсортированный по их размеру. Вот конечный результат

FOLDER="$1"; 
for f in $FOLDER/*; do 
    du -sb "$f"; 
done | sort -n | sed "s#^[0-9]*##" | sed "s#^[^\./]*##" | xargs -L 1 du -sh | sed "s|$FOLDER||"; 

, что приводит к du -sb $FOLDER/* | sort -n | sed "s#^[0-9]*##" | sed "s#^[^\./]*##" | xargs -L 1 du -sh | sed "s|$FOLDER||";

+3

Это справочники. Не папки. ;) –

+0

См. Мой ответ [здесь] (http: // serverfault.com/q/62411/1293 # 62522), чтобы сделать это, называя 'du' только один раз вместо * дважды для каждого файла *. Вам не понадобится цикл 'for'. Вы можете добавить '--max-depth = 1' в' du', если это необходимо, и вы можете добавить 'sed 's $ FOLDER ||" '. –

+0

@ Денис Уильямсон: хороший ответ, не нужно было смотреть в 'awk'. – Quamis

ответ

25

Возможно, xargs, который reinvokes команду, указанную после этого для каждой дополнительной линии параметров, полученных на стандартный ввод ...

ls -1 $FOLDER | xargs du 

Но, в данном случае, почему нет ...

du * 

...? Или ...

for X in *; do 
    du $X 
done 

(Лично я использую ЗШ, где вы можете изменить шаблон Глоб, чтобы найти только сказать, обычные файлы или только каталоги, только символические ссылки и т.д. - я уверен, что есть что-то подобное в Баш - можете узнать подробности, если вам это нужно).

Я пропустил часть вашего требования?

+0

В последнем скрипте должен отображаться список файлов/папок, отсортированных по размеру, упорядоченный по размеру – Quamis

+1

+1 для 'xargs'. Чудесно недооцененный инструмент. –

+0

Хорошо, в этом случае 'du * | sort -n -k1' будет достаточно. Нет? –

0

Это работает для каждого файла в текущем каталоге:

do 
    /usr/local/mp3unicode/bin/mp3unicode -s cp1251 --id3v2-encoding unicode "$file" 
done 
2

бесполезно разобрать вывод ls для цикла над файлами. Баш может сделать это с расширением подстановки.

Сохранение результата du в переменной для вывода его в файл также является бесполезным использованием переменной.

Что я предлагаю:

for i in ./tmp/DIRS/* 
do 
    du "$i" >> "/tmp/DIRS1" 
done 
3

Что случилось с чем-то подобным?

function process() { 
    echo "Processing $1" 
} 

for i in * 
do 
    process $i 
done 

Вы можете поместить всю «работу» Вы хотите сделать внутри функции process. Это сделает это для вашего текущего каталога.

+0

Можете ли вы посмотреть на этот случай? https://stackoverflow.com/questions/45482766/script-to-execute-command-to-all-files-in-folder?noredirect1_comment77926070_45482766 – upicik

6

Команда find позволит вам выполнить команду для каждого найденного элемента. Без дальнейших рассуждений будут найти все файлы и папки в текущей директории, как это:

$ find -exec du -h {} \; 

{} часть является «переменной», где матч ставится, здесь в качестве аргумента du. \; завершает команду.

+2

Это первый случай, когда я увидел пример ' find', который фактически объяснил, как работает полная команда. Благодаря! – alanaktion

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