Как я могу прочитать список имен файлов из файла в ударе?

Eran

спасибо я использую этот код привязки события

this._form.bind('submit', Delegate.create(this, function(e) {
    e.preventDefault();
    this._searchFadeOut();
    this.__onFormSubmit.invoke(this, new ZD.Core.GenericEventArgs(this._dateField.attr('value')));
});

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

31
задан agnul 6 November 2009 в 17:14
поделиться

7 ответов

Используйте read :

while read F  ; do
        echo $F
done </tmp/filelist.txt

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

OLDIFS=$IFS
IFS="
"
for F in $(cat /tmp/filelist.txt) ; do
  echo $F
done
IFS=$OLDIFS

В качестве альтернативы (как предлагает @tangens) преобразовать тело ваш цикл в отдельный сценарий, затем используйте параметр -exec find для запуска if для каждого найденного файла напрямую.

42
ответ дан 27 November 2019 в 22:17
поделиться

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

while read F
do
  ...
done < <(find . -type f -mtime +15)
7
ответ дан 27 November 2019 в 22:17
поделиться

использовать при чтении

echo $FILE | while read line
do
echo $line
done

Вы можете перенаправить вместо эха

4
ответ дан 27 November 2019 в 22:17
поделиться

Вы можете использовать параметр -exec в find и напрямую использовать имена файлов:

find . -type f -mtime +15 -exec <your command here> {} \;

{} является заполнителем для имени файла.

2
ответ дан 27 November 2019 в 22:17
поделиться

направьте вашу команду поиска прямо в цикл while read

find . -type f -mtime +15 | while read -r line
do
   printf "do something with $line\n"
done
1
ответ дан 27 November 2019 в 22:17
поделиться

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

for F in $(find . -type f -mtime +15) ; do
  ...
done;

Нет гарантий, что мой синтаксис верен, но я почти уверен, что концепция работает .

Изменить: если вам действительно нужно обработать файл со списком имен файлов и вы не можете просто объединить команды, как я сделал выше, то вы можете изменить значение переменной IFS - -it означает внутренний разделитель полей - для изменения способа определения полей в bash. По умолчанию это пробел, поэтому новая строка, пробел или табуляция будут начинать новое поле. Если вы установите его так, чтобы он содержал только новую строку, вы можете перебирать файл так же, как и раньше.

-1
ответ дан 27 November 2019 в 22:17
поделиться

Я ни в коем случае не являюсь экспертом по bash (обычно я пишу свой скрипт на ruby ​​или python для кроссплатформенности), но я бы использовал выражение регулярного выражения, чтобы избежать пробелов в каждой строке перед обработкой.

Для Bash Regex: http://www.linuxjournal.com/node/1006996

В аналогичной ситуации в Ruby (обработка файла csv и очистка каждой строки перед его использованием):

File.foreach(csv_file_name) do |line| 
    clean_line = line.gsub(/( )/, '\ ') 
    #this finds the space in your file name and escapes it    
    #do more stuff here
end  
0
ответ дан 27 November 2019 в 22:17
поделиться
Другие вопросы по тегам:

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