Выполнить команду для каждого файла в текущем каталоге - PullRequest
16 голосов
/ 10 ноября 2010

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

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

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||";

Ответы [ 5 ]

29 голосов
/ 10 ноября 2010

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

ls -1 $FOLDER | xargs du

Но, в этом случае, почему бы не ...

du *

...?Или ...

for X in *; do
    du $X
done

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

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

9 голосов
/ 10 ноября 2010

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

$ find -exec du -h {} \;

Часть {} - это "переменная", в которой находится соответствие, здесь в качестве аргумента du \; завершает команду.

3 голосов
/ 10 ноября 2010

Что не так с чем-то вроде этого?

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

for i in *
do
  process $i
done

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

2 голосов
/ 10 ноября 2010

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

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

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

for i in ./tmp/DIRS/*
do
    du "$i" >> "/tmp/DIRS1"
done
0 голосов
/ 10 ноября 2010

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

do
   /usr/local/mp3unicode/bin/mp3unicode -s cp1251 --id3v2-encoding unicode "$file"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...