Рекурсивное выравнивание подкаталогов в корневом каталоге и поддержка структуры подкаталогов уровня 1

Como se mencionó latesten 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

1
25.07.2019, 19:12
2 ответа

Использование zsh:

cd /root
for subdir in subdir*
do
  mv "$subdir"/**/*(.) "$subdir"
  rm -r "$subdir"/*(/)
done

Это:

  1. заменяется на каталог "/root" (из вашего примера)
  2. снова перебирает каждый подкаталог с именемsubdir*(из вашего примера :соответствие subdir1 и subdir1)
  3. перемещает ожидаемый (, но будет соответствовать всем )соответствующим файлам (s )в этом подкаталоге в этот подкаталог. Здесь используется функция рекурсивного подстановки zsh **, ограниченная квалификатором glob *(.), который говорит :о любой записи в этом каталоге, которая является простым файлом
  4. после перемещения файла рекурсивно удалить все подкаталоги внутри этого подкаталога; это снова использует квалификатор zsh glob *(/), который указывает на соответствие записям, которые являются каталогами.
2
27.01.2020, 23:22

В 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)не удастся выполнить, если какие-либо файлы не были перемещены.

Это частично вдохновлено ответом Дероберта на Сведение вложенного каталога .

1
27.01.2020, 23:22

Теги

Похожие вопросы