2012-04-07 3 views
1

Скажите, что я в каталоге, и есть другой каталог с изображениями с изображениями .jpg внутри, что я хочу запустить операцию, скажем, «./operation image1.jpg», как я могу это сделать для каждого jpg в картинах каталога? Когда я искал итерацию через файлы в каталоге, я не мог получить результат, который я хотел.Печать имен файлов в каталоге в Bash

#!/bin/sh 

cd pictures 
pictures=$ls 

for pic in $pictures 
do 
    ./operation $pic 
done 

Это код, который у меня есть. Что я делаю не так?

+0

Если 'operation' принимает несколько аргументов файлов, может быть, вы могли бы просто' операция фотографии/*. Jpg' – tripleee

ответ

3

Не используйте ls, чтобы получить список файлов, так как это не будет работать с пробелами внутри имен файлов. Получается что-то вроде:

my file.jpg 
another file.jpg 

в:

my 
file.jpg 
another 
file.jpg 

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

#!/bin/sh 
cd pictures 
for pic in *.jpg ; do 
    ./operation "$pic" 
done 
+0

намного лучше. :-) –

1

Рекомендуем также

find pictures/ -type f -name '*.jpg' -exec \./operation {} \; 
1

Помимо того, что пробелы в именах файлов будет вызывать проблемы, ваш сценарий будет работать, но неправильное присвоение ваших изображений = $ ls. Это должно быть images = $ (ls) ... Если вам когда-либо понадобится рассмотреть пробел в переменной, поставьте туда двойные кавычки: «$ var» ... Кроме того, не используйте ls в качестве источника имен файлов; у него много проблем, которые избегают другие методы; например, использовать поиск или расширение оболочки, как показано в ответе paxdiablo.

find дает отличный контроль над тем, что вы на самом деле перечисляете, и даже тем, как вы его обрабатываете.

Вот еще несколько способов сделать это.

# using find 
find -maxdepth 1 -type f -name '*.jpg' -exec ./operation "{}" \; 

# using an array 
pic=(*.jpg) 
for p in "${pic[@]}" ;do 
    ./operation "$p" 
done 

# You can (with care) even use ls ... but why would you? 
# I've just added it here to show the use of IFS (Input Field Seperator) 
IFS=$'\n' # this makes `\n` the only delimiter. 
pic=$(ls -1 *.jpg) 
for p in $pic ;do 
    ./operation "$p" 
done 
+0

FWIW, используя «{}» в поиске, не имеет никакого значения, потому что «{}» расширяется bash, а {} расширяется путем поиска в этом порядке. find расширит {} как один аргумент, пробелы в имени файла не имеют значения. – pizza

Смежные вопросы