Bash - номера версий в именах файлов. Как перечислить только последние версии? - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть каталог версионных файлов. Версия каждого файла указывается в его имени файла, например "_v1".

Пример

Список файлов, отображаемых как ls:

123_FileA_v1.txt
123_FileA_v2.txt
132_FileB_v1.txt

Я хочу запустить команду, чтобы увидеть только последние версии:

123_FileA_v2.txt
132_FileB_v1.txt

Моей первой попыткой было перечисление файлов по mtime с использованием

ls -ltr

Но в моем случае это не приводит к достаточным результатам. Я действительно хочу собрать версии из имен файлов.

Как лучше всего это сделать?

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Это будет сделано:

ls | awk -F '_' '!prefixes[$1]++'

Надеюсь, это поможет!

Редактировать:

Если вы хотите увидеть конкретную c информацию, которую вы можете сделать:

ls | awk -F '_' '!prefixes[$1]++' | xargs ls -lh

Это будет работать до тех пор, пока в ваших именах файлов нет пробелов.

Редактировать:

В соответствии с запросом @PaulHodges, вот пример выходных данных: _

$ ls -lh
total 0
drwxr-xr-x    5 Matias-Barrios  Matias-Barrios   160B Feb 27 11:40 .
drwxr-xr-x  106 Matias-Barrios  Matias-Barrios   3.3K Feb 27 11:39 ..
-rw-r--r--    1 Matias-Barrios  Matias-Barrios     0B Feb 27 11:40 132_FileB_v1.txt
-rw-r--r--    1 Matias-Barrios  Matias-Barrios     0B Feb 27 11:40 123_FileA_v2.txt
-rw-r--r--    1 Matias-Barrios  Matias-Barrios     0B Feb 27 11:40 123_FileA_v1.txt
$ ls | awk -F '_' '!prefixes[$1]++' 
.
..
132_FileB_v1.txt
123_FileA_v2.txt
0 голосов
/ 27 февраля 2020

Вы можете сделать что-то вроде

( 
PATTERN="[0-9]{3}_[^_]*" 
for prefix in `find . | egrep -o "$PATTERN" | sort -u`; 
do 
   ls $prefix* | tail -1; 
done
)

Будет напечатано

123_FileA_v2.txt
132_FileB_v1.txt

Что здесь происходит?

  • Окружение фигурные скобки ( используются для поддержки копирования и вставки предоставленного кода. читать дальше
  • Переменная PATTERN используется для доступа ко всем файлам, начинающимся с того же префикса.
  • for prefix in `find . | egrep -o "$PATTERN" | sort -u генерирует список файловых префиксов.
  • В ls $prefix* перечислены все файлы с одинаковым префиксом в алфавитно-цифровом порядке
  • В | tail -1 отображается только последняя запись из предыдущего ls $prefix*

Edit

Я решил использовать find . вместо ls *. После этого я надеюсь обойти проблемы с ls *. Пожалуйста, поправьте меня, если я ошибаюсь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...