Мне нужна команда для переименования всех файлов в текущем рабочем каталоге таким образом, чтобы новое имя файла было таким же, как старое, но с суффиксом, соответствующим количеству строк исходных файлов (например, если файл f
имеет 10 линии, то он должен быть переименован в f_10
).
Вот моя (нерабочая) попытка:
linenum=$(wc -l); find * -type f | grep -v sh | rename 's/^/ec/'*
bash
batch-rename
Мартин Йебоа
источник
источник
Ответы:
Как насчет:
Например:
Если вы хотите сохранить расширения (если они есть), используйте вместо этого:
источник
_
. Что касается сценария, какой сценарий? Это должно быть запущено из командной строки, нет необходимости в сценарии. Если вы хотите, чтобы он совпадал только с некоторыми файлами, изменитеin *
значение, например, наin *txt
что-то другое.wc -l < $f
вместо grep было бы легче понять (и, возможно, лучше выполнить, но я не проверял это).wc
, я хотел показать другой подход. Но хорошо, достаточно справедливо.Вы можете попробовать этот лайнер:
Это найдет все файлы в текущем рабочем каталоге (
find . -maxdepth 1 -type f
)Затем мы запускаем экземпляр оболочки над найденными файлами, чтобы переименовать файлы и добавить число строк.
Пример :
источник
Другой способ, который сохраняет расширение (если присутствует), используя
rename
:Если результат ожидаемый, уберите
-n
опцию:источник
rename
отлично =) +1(\.?[^\.]+)
.(\.?[^\.]+)
это тоже не нормально, потому что оно будет соответствовать только до второй точки и не будет совпадать с именем файла с последовательными точками или независимо от точки. Это непростое решение, кажется, единственный способ сделать две замены..
внутри классов персонажей.Использование
find
:пример
источник
-name "*"
? Остаток от испытаний? ;)Просто для удовольствия и хихикает решение с
rename
. Такrename
как это инструмент Perl, который принимает произвольную строку, которая является eval'd, вы можете делать все виды махинаций. Решение, которое кажется эффективным, заключается в следующем:источник
Сценарий, приведенный ниже, охватывает несколько случаев: одну точку и расширение (file.txt), несколько точек и расширений (file.1.txt), последовательные точки (file..foobar.txt) и точки в имени файла (file. Or файл..).
Сценарий
Сценарий в действии
Обратите внимание, что в файле нет строк. и файл .., следовательно, количество строк равно 0
Отдельное спасибо Тердону и Хелио за рецензирование сценария и предложенные изменения
источник
Еще один способ, разработанный с помощью @Helio в чате :
Странно выглядящий парень с односторонними головами (
(.*)(\.[^.]+)$
) должен соответствовать только правильным расширениям (.foo
не..
). Если расширения нет, тоBASH_REMATCH
массив будет пустым. Мы можем воспользоваться этим, используя значение по умолчанию для имени файла${BASH_REMATCH[1]:-$file}
и просто используя расширение как есть.Для работы с точечными файлами вы можете использовать
find
, как это предложили Тердон и Хелио .источник