цикличное выполнение через 'ls' приводит к сценарию оболочки удара

Делает у любого есть шаблонный сценарий оболочки для того, чтобы сделать что-то с ls для списка имен каталогов и цикличного выполнения через каждого и выполнения чего-то?

Я планирую сделать ls -1d */ получить список имен каталогов.

97
задан 06.09.2017, 16:30

4 ответа

Отредактированный для не использования 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
115
ответ дан 07.12.2019, 07:57

Поскольку файлы с пробелами в Вас должны будут удостовериться, что заключили переменную в кавычки как:

 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;
17
ответ дан 07.12.2019, 07:57

Это - то, как я делаю это, но существуют, вероятно, более эффективные пути.

ls > filelist.txt

while read filename; do echo filename: "$filename"; done < filelist.txt
-3
ответ дан 07.12.2019, 07:57
  • 1
    Здорово. Я должен сказать, что можно также использовать $EDITOR filelist.txt, промежуточный две команды. Много материала, который можно сделать в редакторе, который легче, чем на командной строке. Не относящийся к этому вопросу, все же. – TREE 31.08.2009, 21:45

Если у Вас есть Параллель 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

5
ответ дан 07.12.2019, 07:57

Теги

Похожие вопросы