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
, соединяя первую и последнюю строку запятой: опция -n
подавляет вывод по умолчанию, ] 1h
сохраняет первую строку (самое новое имя файла) в пространстве удержания , а в последней строке файла (выбранном $
) добавляет пространство удержания (самое новое имя файла ) с H
в пространство шаблонов (разделенное новой строкой) и заменяет эту новую строку запятой.
Затем сценарий printf
определяет имя подкаталога, за которым следует запятая, за которыми следуют файлы, полученные из sed
.
Это не делает различий между каталогами и файлами для выбора самого старого / самого нового, поэтому, если вам не нужны каталоги, вам нужно отфильтровать вывод ls -t
, чтобы удалить каталоги.
Использование Awk:
awk -F, 'NR==FNR {TaxID[$2]=1; next} FNR==1 || $NF in TaxID' File1 File2
Object_ID, Length, Assignment
NODE_6498_length_5833_cov_14.8079,5833,155978