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

78

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

Пример:

У меня

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/

Привет,

  • 0
    Используйте AWK как в этом ответе: awk '$ 0 = "prefix" $ 0' file> new_file
Теги:

9 ответов

129

Благодаря Peter van der Heijden, здесь, который будет работать с именами файлов с пробелами в них:

for f in * ; do mv "$f" "PRE_$f" ; done
  • 1
    остерегайтесь имен файлов с пробелами в них ...
  • 0
    Хех, правда, это совершенно не будет работать, если у вас есть файл с пробелом в нем.
Показать ещё 6 комментариев
61

Используйте переименование script следующим образом:

$ rename 's/^/PRE_/' *

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

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

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

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

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

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

  • 2
    PS: Если вы просто хотите переименовать файлы деталей (каталоги) текущего каталога, просто отфильтруйте их перед xargs, например: ls *.old | xargs -I {} mv {} PRE_{}
  • 0
    интересно использование переименования не сработало. использование xargs прошло хорошо для моей установки RHEL, так что +1 для этой опции облегчает понимание команды
16

Это можно сделать, выполнив простую команду find:

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

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

7

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

rename '' <prefix> *

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

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

  • 0
    util-linux в Debian Stretch, по-видимому, предоставляет это как /usr/bin/rename.ul .
6

с Perl:

perl -e 'rename $_, "PRE_$_" for <*>'
5

Если у вас есть Ruby (1.9 +)

ruby -e 'Dir["*"].each{|x| File.rename(x,"PRE_"+x) }'
2

Вот простой script, который вы можете использовать. Мне нравится использовать нестандартный модуль File::chdir для управления управляющими операциями cd, поэтому для использования этого script as-it вам потребуется его установить (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: $!";
}
0

В моей системе у меня нет команды 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню