Как сортировать файлы по измененной временной метке в unix, чтобы шеллскрипт выбирал их по одному за раз

#shell #unix

#оболочка #unix

Вопрос:

Я пишу сценарий оболочки, который выбирает по одному файлу за раз и обрабатывает их. Я хочу, чтобы скрипт выбирал файлы в порядке возрастания их измененного времени.

Я использовал приведенный ниже код для выбора файлов .csv с определенным шаблоном имени файла.

 for file in /filepath/file*.csv
do
  #mystuff
done
 

Но я ожидаю, что скрипт будет выбирать файлы .csv в соответствии с порядком возрастания их измененного времени. Пожалуйста, предложите.

Заранее спасибо

Ответ №1:

Если вы уверены, что имена файлов не содержат никаких «странных» символов, например, новой строки, вы можете использовать возможность сортировки ls и прочитать вывод с while read... помощью цикла. Это также будет работать для имен файлов, содержащих пробелы.

 ls -tr1 /filepath/file*.csv | while read -r file
do
    mystuff "$file"
done
 

Обратите внимание, что это решение должно быть предпочтительнее, чем что-то вроде
for file in $(ls -tr /filepath/file*.csv) ...
потому что это не удастся, если у вас есть имя файла, содержащее пробел из-за задействованного здесь разделения слов.

Ответ №2:

Вы можете возвращать результаты ls -t в виде массива. (-t сортирует по измененному времени)

 csvs=($(ls -t /filepath/file*.csv))
 

Затем примените цикл for.

 for file in $csvs
do
  #mystuff
done
 

Ответ №3:

с вашим циклом «для»

 for file in "`ls -tr /filepath/file*.csv`"
do
  mystuff $file 
done
 

Комментарии:

1. Это не сработает, если у вас есть имя файла, содержащее пробел. Смотрите mywiki . wooledge.org/BashPitfalls#for_f_in_.24.28ls_.2A.mp3.29