Переименовать файлы и каталоги (добавить префикс)


137

Я хотел бы добавить префикс для всех папок и каталогов.

Пример:

у меня есть

Hi.jpg
1.txt
folder/
this.file_is.here.png
another_folder.ok/

Я хотел бы добавить префикс "PRE_"

PRE_Hi.jpg
PRE_1.txt
PRE_folder/
PRE_this.file_is.here.png
PRE_another_folder.ok/

С Уважением,


Использование AWK , как на этом ответ: AWK '$ 0 = "префикс" $ 0' файла> new_file
— Mark

Ответы:


224

Благодаря Питеру ван дер Хейдену , вот тот, который будет работать для имен файлов с пробелами в них:

for f in * ; do mv -- "$f" "PRE_$f" ; done

(«-» необходимо для успешного выполнения файлов, начинающихся с тире, имена которых иначе интерпретировались бы как переключатели для команды mv)


Хех, правда, это совершенно не будет работать, если у вас есть файл с пробелом в нем.
— CanSpice

12
Если вы измените lsкоманду на *и поставите двойные кавычки вокруг аргументов mv, она будет работать для файлов, содержащих пробелы.
— Питер ван дер Хейден

@CanSpice Можно ли отменить эту операцию (удалить префикс) с помощью аналогичного сценария?
— Паскаль Куй

3
Спасибо друг. Стажер здесь терял пальцы, переименовывая все 67 файлов. Приветствия.
— Фелипе

1
Это должен быть "mv -", а не просто "mv", для защиты от файлов, начинающихся с тире, которые иначе интерпретировались бы как переключатели команд. Я внесу правку, чтобы исправить это.
— Джейкоб С. говорит восстановить Монику

81

Используйте переименовать скрипт таким образом:

$ rename 's/^/PRE_/' *

Нет проблем с метасимволами или пробелами в именах файлов.


3
В некоторых системах есть утилита util-linux под названием «переименование», которая работает по-другому (в Ubuntu она называется «rename.ul»).
— Приостановлено до дальнейшего уведомления.

renameвсегда помогал мне легко обрабатывать несколько переименований файлов.
— Алан Хаггай Алави

61

Для добавления префикса или суффикса для файлов (каталогов), вы можете использовать простой и мощный способ с помощью xargs :

ls | xargs -I {} mv {} PRE_{}

ls | xargs -I {} mv {} {}_SUF

Он использует параметр замены параметра xargs: -I. И вы можете получить более подробную информацию из справочной страницы.


2
PS: Если вы просто хотите переименовать файлы деталей (каталоги) текущего каталога, просто отфильтруйте их перед xargs, например:ls *.old | xargs -I {} mv {} PRE_{}
— Zheng Qsin

интересно использование переименования не сработало. использование xargs прошло хорошо для моей установки RHEL, так что +1 для этой опции облегчает понимание команды
— Acewin

Не работает, если имя файла содержит одинарные кавычки, происходит сбой с: xargs: unmatched single quote; по умолчанию кавычки являются специальными для xargs, если вы не используете опцию -0
— Евгений Веретенников

36

Это можно сделать с помощью простой findкоманды:

find * -maxdepth 0 -exec mv {} PRE_{} \;

Приведенная выше команда префикс всех файлов и папок в текущем каталоге с PRE_.


8

Чтобы добавить префикс ко всем файлам и папкам в текущем каталоге с помощью util-linux rename(в отличие prenameот варианта perl из Debian и некоторых других систем), вы можете сделать:

rename '' <prefix> *

Это находит первое вхождение пустой строки (которая обнаруживается немедленно), а затем заменяет это вхождение вашим префиксом, а затем склеивает оставшуюся часть имени файла до конца этого. Готово.

Для суффиксов вам нужно использовать версию perl или использовать find .


util-linuxна Debian Stretch, кажется, обеспечивает это как /usr/bin/rename.ul.
— user1338062



2

Вот простой скрипт, который вы можете использовать. Мне нравится использовать нестандартный модуль File::chdirдля управления cdоперациями, поэтому чтобы использовать этот скрипт как есть, вам нужно установить его ( sudo cpan File::chdir).

#!/usr/bin/perl

use strict;
use warnings;

use File::Copy;
use File::chdir; # allows cd-ing by use of $CWD, much easier but needs CPAN module

die "Usage: $0 dir prefix" unless (@ARGV >= 2);
my ($dir, $pre) = @ARGV;

opendir(my $dir_handle, $dir) or die "Cannot open directory $dir";
my @files = readdir($dir_handle);
close($dir_handle);

$CWD = $dir; # cd to the directory, needs File::chdir

foreach my $file (@files) {
  next if ($file =~ /^\.+$/); # avoid folders . and ..
  next if ($0 =~ /$file/); # avoid moving this script if it is in the directory

  move($file, $pre . $file) or warn "Cannot rename file $file: $!";
}

1

В моей системе у меня нет renameкоманды. Вот простой вкладыш. Он находит все файлы HTML рекурсивно и добавляет prefix_перед их именами:

for f in $(find . -name '*.html'); do mv "$f" "$(dirname "$f")/prefix_$(basename "$f")"; done

1
с ним findвы также можете выполнять команды, без необходимости в цикле: stackoverflow.com/a/33297439/2351568
— DJCrashdummy

0

Это префикс ваших файлов в их каталоге.

${f%/*}Путь до последнего слэша /-> каталог

${f##*/}Текст без чего - либо до последнего слеша /-> имя файла без пути

Вот как это происходит:

for f in $(find /directory/ -type f); do 
  mv -v $f ${f%/*}/$(date +%Y%m%d)_Prefix_${f##*/}
done
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.