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

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

У меня есть директор в

Мой главный директор -/tmp/folder

Внутри /tmp/folderнаходится X папок (не файлов). Например

/tmp/folder/1
/tmp/folder/2
/tmp/folder/3
/tmp/folder/4
/tmp/folder/5

Внутри этих папок много файлов с одинаковым расширением. Я хочу из каждой из этих папок получить последний и первый созданный файл (время изменения).

Я предпочитаю, чтобы результат был таким

/tmp/folder/1,OLD_FILE,NEW_FILE
/tmp/folder/2,OLD_FILE,NEW_FILE
/tmp/folder/3,OLD_FILE,NEW_FILE
/tmp/folder/4,OLD_FILE,NEW_FILE
/tmp/folder/5,OLD_FILE,NEW_FILE

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

Команда bash должна быть только 1

решение1

find "$DIR" -type d | while read d; do echo "$d,$(ls -t "$d" | sed -n '1h; $ { G; s/\n/,/g; p }')"; done

Или в более удобном для чтения формате, используя дополнительную переменную для демонстрации:

find "$DIR" -type d |
while read d;
do
    files=$(ls -t "$d" | sed -n '1h; $ { G; s/\n/,/g; p }')
    printf '%s,%s\n' "$d" "$files";
done

Это находит все подкаталоги, $DIRиспользующие findкоманду. Для каждого найденного, использует ls -trдля получения списка файлов в этом каталоге, отсортированных по дате, самые новые сначала.

Направьте вывод ls -trв sedсоединение первой и последней строки запятой: Option -nподавляет вывод по умолчанию, 1hсохраняет первую строку (имя самого нового файла) вудерживайте пространство, а в последней строке файла (выбранной с помощью $) добавляет пробел (имя самого нового файла) к Hпробелу шаблона (разделенному символом новой строки) и заменяет этот символ новой строки на запятую.

Затем скрипт printfдобавляет имя подкаталога, за которым следует запятая, а затем файлы, полученные из sed.

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

Связанный контент