Сортуйте файли в каталозі рекурсивно на основі останньої модифікованої дати


11

Сортуйте файли в каталозі рекурсивно на основі останньої модифікованої дати

Я змінив багато файлів у своєму каталозі, хочу знати, що це за файли, сортуючи їх за останньою зміненою датою, і я хочу, щоб деякі розширення були виключені

У каталозі svn у мене також дуже багато файлів .svn, які я не хочу показувати у своєму роді


Я демонструю, як виключити розширення у своїй відповіді.
mikeserv

Відповіді:


18
find -printf "%TY-%Tm-%Td %TT %p\n" | sort -n

подарує вам щось подібне

2014-03-31 04: 10: 54.8596422640 ./foo 2014-04-01
01: 02: 11.9635521720 ./bar


Чи можу я виключити розширення файлу з папки ....
Денні,

@Danny Так, це легко з знахідкою: find -not -iname '*.ext'.
n.st

знайти -not-шлях " svn " -not -name "* svn" -printf "% TY-% Tm-% Td% TT% p \ n" | сортувати -н саме це мені було потрібно спасибі @ n.st
Danny

5

Якщо ви хочете вирівняти структуру каталогів (таким чином сортуючи за датою по всіх файлах у всіх каталогах, ігноруючи, в якому каталозі перебувають файли) find- шлях, запропонований @yeti. Якщо ви хочете зберегти структуру каталогу, ви можете спробувати

$ ls -ltR /path/to/directory

який заснований на каталозі сортування.


1
це дайте мені папку мудру, де як те, що мені потрібно, це все разом, які є нещодавно змінені файли
Денні,

5

У баш, біжи shopt -s globstarпершим. У ksh93 запустіть set -o globstarперше. У zsh, ви вже налаштовані.

ls -dltr **/*

Це призведе до помилки, якщо у вас стільки файлів, що в вашій системі буде перевищено обмеження довжини командного рядка. У zsh ви можете використовувати це замість:

print -rl -- **/*(Om)

Це єдина відповідь тут, яка працює для Solaris 10, дякую! :)
laxxy

3

Припускаючи, що ви використовуєте GNU, знайдіть, спробуйте:

find $SOMEPATH -exec stat -c '%Y %n' '{}' + | sort -n

1
Ви можете використовувати find«s -printfможливість уникнути виклику окремого процесу (або кілька, в залежності від кількості файлів). Дивіться мою відповідь для прикладу.
n.st

1
Знаючи, що є й інші способи це зробити, я хотів дати statшанс і показати -exec ... +. Дійсно! Іноді я думаю, statзаслуговує на більшу увагу ... і ніхто не повинен приймати звідси рецепти, не читаючи про інгредієнти і не замислюючись про наслідки ...

Btw ... не кожна знахідка має -printf...

1
@yeti - Якщо у вас findнемає -printf, ви можете використовувати -exec sh -c 'printf...'для отримання однакової функції. Це включає також доступ до $(pwd)повністю кваліфікованих шляхів.
mikeserv

2
Я зустрів багато користувачів Linux, про які ніколи не читав stat. Тому іноді просто хочеться привернути деяку увагу на stat... Я думаю, що statце заслуговує ...

2

Щоб чітко перелічити назви файлів лише за допомогою останніх інструментів GNU:

find . -printf '%A@ %p\0' |
  sort -nz |
  sed -z 's/^[^ ]* //' |
  tr '\0' '\n'

2
find $DIR -depth -maxdepth 3 \
    -type d -readable -printf \
    'printf "\\n%p\\n"
    ls -t --color=always "%p"\n' |\
    . /dev/stdin 2>&-

Це дозволяє уникнути будь-яких проблем зі списком аргументів, оскільки єдиний аргумент lsколи-небудь отримає - це ім'я каталогу, який ви хочете перелічити. Ви можете робити це з усім, що завгодно.

Оболонка просто як сценарій оболонки - це той же процес , і не має проблем , ви можете зіткнутися при виклику.. sources|pipeexecve

У будь-якому випадку - вищесказане йде лише на три глибини, яке регулюється зміною maxdepth. Спершу це також глибоко - тому ви працюєте назад до поточного каталогу depth.

Ви можете помітити, що ви також отримуєте $LSCOLORS- на моїй машині він також містить акуратно надруковані стовпчики та все інше, від чого ви хочете ls- або, з цього приводу, все, що ви можете собі уявити, що хочете зробити з. source.

НІ SVN

Знову ж таки, це зробить все, що ви очікуєте ls. Отож, заховати .svnфайли так само просто, як змінити lsрядок на:

ls -t --color=always --hide="*svn" "%p"\n

Або якщо ви хочете бачити svnрозширення у кожній папці, але ./svnви можете змінити його, щоб вся команда виглядала так:

    find $DIR -depth -maxdepth 3 \
        -type d -readable -printf \
            'printf "\\n%p\\n" ; hide=
            [ "%p" = "./svn" ] && hide="*svn"
            ls -t --color=always --hide="$hide" "%p"\n' |\
    . /dev/stdin 2>&-

Особисто мені це подобається з ls's, -sі якщо вам все одно, -uбуде сортувати за часом доступу, а не часом моди.


1

Це один перерахує всі files в <dir>з верхнім істотою найстарішим модифіковано

find <dir> -type f -print0 | xargs -0 ls -ltr

І з цим остання модифікація є найвищою

find <dir> -type f -print0 | xargs -0 ls -lt

Зауважте, що це працює лише в тому випадку, якщо список імен файлів не перевищує загальну межу довжини командного рядка у вашій системі.


правда, я про це забув
UnX

для довідки про команду: список аргументів занадто довгий in-ulm.de/~mascheck/various/argmax
UnX

@Gilles: Ви маєте на увазі xargs -0(в обох випадках).  xargs -print0еквівалентно xargs -p -r -i -n -t -0або xargs -inprt0або xargs -0ntrip, що, ймовірно , не те , що ви мали в виду.
Скотт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.