Можно ли переименовать файлы, выбранные ls?

sudo dpkg --configure -a

Исправлены сломанные пакеты

3
задан 28 April 2017 в 11:50

6 ответов

Как уже указывалось, разбор ls является хрупким. Он сломается, если ваши имена файлов имеют какой-либо тип странности (пробелы, символы новой строки, управляющие символы и т. Д.). Поскольку вы хотите заменить пробелы на _, ваш предложенный подход не удастся. Безопасный способ сделать это будет:

stat --printf '%n/%Y\0' * | sort -rz -t'/' -k 2 | head -z -n 3 | 
    cut -d'/' -z -f 1 | xargs -0 perl-rename 's/ /_/g'
stat --printf '%n/%Y\0' *: это выведет имя (%n) каждого файла или каталога в текущем каталоге, за которым следует слэш (/, Я использую косую черту, поскольку это недопустимо в имени файла, поэтому можно безопасно использовать ее как разделитель) и время модификации файла в секундах с момента эпохи (%Y) и, наконец, символ NULL (\0), , sort -rz -k 2: для этого потребуется NULL-разделенный вход (-z) и отсортировать его в обратном порядке (-r) на основе значения во втором поле / -сепарализованного (-t'/') каждой строки ([ F14]). head -z -n 5: сохранить первые 5 (-n 5) нулевых разделов (-z). cut -d'/' -z -f 1: распечатать 1-е (-f 1) / -сепарализованное (-d /) поле с нулевым ограничением (-z).
1
ответ дан 22 May 2018 в 23:07

Я просто дал ls -q попытку:

IFS='
'
for file in `ls -tr1q|tail -n5`; do
  rename 's/ /_/g' "$file"
done

Требуется ли переименование, даже для имен файлов с новой строкой или другими управляющими символами, хотя и дает ошибку:

Unsuccessful stat on filename containing newline at /usr/bin/rename line 59

(с perl v5.20.2)

0
ответ дан 22 May 2018 в 23:07

Я просто дал ls -q попытку:

IFS=' ' for file in `ls -tr1q|tail -n5`; do rename 's/ /_/g' "$file" done

Требуется ли переименование, даже для имен файлов с новой строкой или другими управляющими символами, хотя и дает ошибку:

Unsuccessful stat on filename containing newline at /usr/bin/rename line 59

(с perl v5.20.2)

0
ответ дан 18 July 2018 в 14:07

Как уже указывалось, разбор ls является хрупким. Он сломается, если ваши имена файлов имеют какой-либо тип странности (пробелы, символы новой строки, управляющие символы и т. Д.). Поскольку вы хотите заменить пробелы на _, ваш предложенный подход не удастся. Безопасный способ сделать это будет:

stat --printf '%n/%Y\0' * | sort -rz -t'/' -k 2 | head -z -n 3 | cut -d'/' -z -f 1 | xargs -0 perl-rename 's/ /_/g' stat --printf '%n/%Y\0' *: это выведет имя (%n) каждого файла или каталога в текущем каталоге, за которым следует слэш (/, Я использую косую черту, поскольку это недопустимо в имени файла, поэтому можно безопасно использовать ее как разделитель) и время модификации файла в секундах с момента эпохи (%Y) и, наконец, символ NULL (\0), , sort -rz -k 2: для этого потребуется NULL-разделенный вход (-z) и отсортировать его в обратном порядке (-r) на основе значения во втором поле / -сепарализованного (-t'/') каждой строки (-k 2). head -z -n 5: сохранить первые 5 (-n 5) нулевых разделов (-z). cut -d'/' -z -f 1: распечатать 1-е (-f 1) / -сепарализованное (-d /) поле с нулевым ограничением (-z).
1
ответ дан 18 July 2018 в 14:07

Я просто дал ls -q попытку:

IFS=' ' for file in `ls -tr1q|tail -n5`; do rename 's/ /_/g' "$file" done

Требуется ли переименование, даже для имен файлов с новой строкой или другими управляющими символами, хотя и дает ошибку:

Unsuccessful stat on filename containing newline at /usr/bin/rename line 59

(с perl v5.20.2)

0
ответ дан 24 July 2018 в 20:20

Как уже указывалось, разбор ls является хрупким. Он сломается, если ваши имена файлов имеют какой-либо тип странности (пробелы, символы новой строки, управляющие символы и т. Д.). Поскольку вы хотите заменить пробелы на _, ваш предложенный подход не удастся. Безопасный способ сделать это будет:

stat --printf '%n/%Y\0' * | sort -rz -t'/' -k 2 | head -z -n 3 | cut -d'/' -z -f 1 | xargs -0 perl-rename 's/ /_/g' stat --printf '%n/%Y\0' *: это выведет имя (%n) каждого файла или каталога в текущем каталоге, за которым следует слэш (/, Я использую косую черту, поскольку это недопустимо в имени файла, поэтому можно безопасно использовать ее как разделитель) и время модификации файла в секундах с момента эпохи (%Y) и, наконец, символ NULL (\0), , sort -rz -k 2: для этого потребуется NULL-разделенный вход (-z) и отсортировать его в обратном порядке (-r) на основе значения во втором поле / -сепарализованного (-t'/') каждой строки (-k 2). head -z -n 5: сохранить первые 5 (-n 5) нулевых разделов (-z). cut -d'/' -z -f 1: распечатать 1-е (-f 1) / -сепарализованное (-d /) поле с нулевым ограничением (-z).
1
ответ дан 24 July 2018 в 20:20
  • 1
    Я думаю, новые строки в именах файлов возможны и законны, но не легитимны – Philippos 28 April 2017 в 11:40
  • 2
    +1 для оговорки, но обратите внимание, что нет пользы от использования ls -t | head -n5 | xargs rename . . . по сравнению с rename $(ls . . .). – terdon♦ 28 April 2017 в 11:41
  • 3
    @Philippos они являются «законными». что бы это ни значило. Они существуют в дикой природе и часто могут быть созданы случайно. Некоторые люди могут даже создать их нарочно. Тем не менее, речь идет не только о символах новой строки, но и синтаксический анализ ls, если файл содержит \r. – terdon♦ 28 April 2017 в 11:46
  • 4
    @terdon Мне не нравится спорить о словах, но то, что вы говорите, подходит и «законно», но не «законно». Если вы называете это законным, вы поощряете людей заботиться о возможности в своих сценариях. Но если вы называете это законным, вы призываете людей создавать имена файлов с контрольными символами. Но я считаю важным сказать людям, чтобы они не обманывали эту возможность. Извините за nitpicking. – Philippos 28 April 2017 в 11:58
  • 5
    @Dabo Конвейер find, который вы хотите: find . -maxdepth 1 -mindepth 1 -printf '%T@ %p\0' | sort -zn | sed -zn '1,5s/^[0-9]*.[0-9]* //p' – muru 28 April 2017 в 12:06

Другие вопросы по тегам:

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