Делает у любого есть шаблонный сценарий оболочки для того, чтобы сделать что-то с ls
для списка имен каталогов и цикличного выполнения через каждого и выполнения чего-то?
Я планирую сделать ls -1d */
получить список имен каталогов.
Отредактированный для не использования ls, где шарик сделал бы, как @shawn-j-goff и предложенные другие.
Просто используйте a for..do..done
цикл:
for f in *; do
echo "File -> $f"
done
Можно заменить *
с *.txt
или любой другой шарик, который возвращает список (файлов, каталогов или чего-либо в этом отношении), команда, которая генерирует список, например, $(cat filelist.txt)
, или на самом деле замените его списком.
В do
цикл, Вы просто обращаетесь к переменной цикла с префиксом знака доллара (так $f
в вышеупомянутом примере). Вы можете echo
это или делает что-либо еще к нему, Вы хотите.
Например, для переименования весь .xml
файлы в текущем каталоге к .txt
:
for x in *.xml; do
t=$(echo $x | sed 's/\.xml$/.txt/');
mv $x $t && echo "moved $x -> $t"
done
Или еще лучше при использовании Bash, можно использовать расширения параметра Bash вместо того, чтобы породить подоболочку:
for x in *.xml; do
t=${x%.xml}.txt
mv $x $t && echo "moved $x -> $t"
done
Поскольку файлы с пробелами в Вас должны будут удостовериться, что заключили переменную в кавычки как:
for i in $(ls); do echo "$i"; done;
или, можно изменить переменную среды разделителя поля ввода (IFS):
IFS=$'\n';for file in $(ls); do echo $i; done
Наконец, в зависимости от того, что Вы делаете, Вам даже, возможно, не понадобится ls:
for i in *; do echo "$i"; done;
Это - то, как я делаю это, но существуют, вероятно, более эффективные пути.
ls > filelist.txt
while read filename; do echo filename: "$filename"; done < filelist.txt
Если у Вас есть Параллель GNU, http://www.gnu.org/software/parallel/ установил Вас, может сделать это:
ls | parallel echo {} is in this dir
Переименовать весь .txt к .xml:
ls *.txt | parallel mv {} {.}.xml
Посмотрите вводное видео для Параллели GNU для узнавания больше: http://www.youtube.com/watch?v=OpaiGYxkSuQ