
У меня есть директор в
Мой главный директор -/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
чтобы удалить их.