Como se mencionó latest
en cuestión, podemos verificar con el tiempo de modificación de los archivos en el directorio.
cat $(ls -ltr *.txt | tail -n5 | awk '{print $NF}' | tr '\n' ' ')
ls -ltr
-mostrará una lista de archivos con respecto a la marca de tiempo de modificación (inversa)
tail -n5
-tomará los últimos 5 archivos
$NF
-último campo
tr
-transponer columna a fila
Использование zsh:
cd /root
for subdir in subdir*
do
mv "$subdir"/**/*(.) "$subdir"
rm -r "$subdir"/*(/)
done
Это:
subdir*
(из вашего примера :соответствие subdir1 и subdir1)**
, ограниченная квалификатором glob *(.)
, который говорит :о любой записи в этом каталоге, которая является простым файлом *(/)
, который указывает на соответствие записям, которые являются каталогами. В bash сделайте следующее:
shopt -s dotglob
for d in root/*/
do
find "$d" -type f -exec mv -i -t "$d" {} +
find "$d" -mindepth 1 -type d -delete
done
Здесь рассматривается все в «root
», включая файлы с точками -. Если вам не нужно просматривать файлы с точкой -, пропустите shopt -s dotglob
. Предупреждение :не добавляйте.*
или root/.*
на команду for
.
/
в конце глобуса (root/*/
), как предложил Джефф, получает только подкаталоги, поэтому нам не нужно тестировать каждый (, например, сif
).
Для каждого подкаталога из root
найти все файлы в этом подкаталоге и под ним и переместите их в подкаталог. Используйте -i
, чтобы предотвратить перезапись файлов. (например, если у вас есть несколько файлов с именем file1
распространяется подsubdir1
). -i
означает «интерактивный», и спросит вас, следует ли перезаписать существующий файл. Имейте в виду, что он может отказаться сделать это, даже если вы ответите "да". Если ваша версия mv
не поддерживает параметр -t
, замените строку с командой mv
на
find "$d" -type f -exec mv -i {} "$d" ';'
Затем удалите все подкаталоги в подкаталоге верхнего -уровня. Обратите внимание, что(find
…-delete
)не удастся выполнить, если какие-либо файлы не были перемещены.
Это частично вдохновлено ответом Дероберта на Сведение вложенного каталога .