Выполнить команду для каждого файла в текущем каталоге
Как я могу выполнить определенную команду для каждого файла/папки в текущей папке?
Я начал с этого как базовый 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