#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