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

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

Я начал с этого как базовый script, но похоже, что он работает только при использовании временных файлов, и мне не очень нравится 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||";

Ответы

Ответ 1

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

ls -1 $FOLDER | xargs du

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

du *

...? Или...

for X in *; do
    du $X
done

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

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

Ответ 2

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

$ find -exec du -h {} \;

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

Ответ 3

Что не так с этим?

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

for i in *
do
  process $i
done

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

Ответ 4

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

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

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

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

Ответ 5

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

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