как переименовать файлы при копировании?


12

Как мне скопировать (стиль архива, где дата не изменена) все файлы в каталоге резервных копий в каталог пользователя при переименовании каждого файла, чтобы удалить случайную часть строки из имени (то есть -2b0fd460_1426b77b1ee_-7b8e)?

ср от:

/backup/path/data/Erp.2014.02.16_16.57.03-2b0fd460_1426b77b1ee_-7b8e.etf

чтобы:

/home/user/data/Erp.2014.02.16_16.57.03.etf

Каждый файл всегда начинается с "Erp." затем следует строка с отметкой даты и времени, за которой следует случайная строка, а затем расширение «.etf». Я хочу сохранить все элементы имени, включая отметку даты и времени. Я просто хочу удалить случайную строку.

Случайная строка позволяет создавать несколько резервных копий одного и того же файла. Тем не менее, в этом случае я просто запустил fdupes и дубликатов нет. Так что я могу просто восстановить все файлы, удалив случайную строку.

Я ищу однострочную команду bash, чтобы сделать это.

Если это не сработает, я мог бы сделать это в два или более шагов. Я обычно использую KRename, но в этом случае мне нужно сделать это в Bash. (Я работаю удаленно.)

Ответы:


7

paxможет сделать это все сразу. Вы могли бы сделать:

cd /backup/path/data && pax -wrs'/-.*$/.etf/' Erp*etf /home/user/data

paxпо умолчанию сохраняет время, но может добавить, -peчтобы сохранить все (лучше всего делать с правами root) или -ppсохранить права доступа, например:

cd /backup/path/data && pax -wrs'/-.*$/.etf/' -pe Erp*etf /home/user/data

В противном случае ( paxобычно не доступно по умолчанию), конечно, лучше сделать копию, чем rename:

cp -a /backup/path/data/Erp*.etf /home/user/data
rename 's/-.*$/.etf/' /home/user/data/Erp*.etf

Таким образом, для каждого файла не запускается отдельный процесс.


1
Я вижу, что мне нужно познакомиться с pax. Это выглядит как очень полезный инструмент. Меня удивляет, почему в других дистрибутивах это не стандартно ...
MountainX

@MountainX, Хороший вопрос, согласно Википедии, paxсуществует в Linux Standard Base с 2005 года. Кроме того, альтернативой для этого является, GNU cpio, возможно, наименее полезный инструмент GNU из существующих.
Грэм,

1
+1 за ваше последнее решение. Таким образом, для каждого файла не запускается отдельный процесс. Но rename в Fedora / Red Hat все по-другому: я не знаю, как использовать это в этом случае.
Эрик

15

Вы можете использовать cpкоманду с -aопцией

-a, --archive
       same as -dR --preserve=all

А затем используйте цикл for, чтобы переименовать все файлы при копировании:

for file in Erp*etf; do
  cp -a $file destinationDirectory/${file%%-*}.etf
done

Готов. Запустите эту команду в исходном каталоге.

Объяснение: Символ %%-*будет обрезать все символы после первого появления дефиса / минуса, -а .etfв конце снова будет добавлено расширение файла.

Ну и как один вкладыш, все это в одну строчку. :-) Как это

for file in Erp*etf; do cp -a $file destinationDirectory/${file%%-*}.etf; done

1
Спасибо, не могли бы вы процитировать документацию за %%-*совет? Мне любопытно.
союка

3

В зш, пользуйся zmv. Поместите это в свой .zshrc:

autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'

Тогда используйте

zcp '/backup/path/data/(*)-[0-9A-Fa-f_]#.(*)' '/home/user/data/$1$2'

В Баш:

zsh -c 'autoload zmv; zmv -C $0 $1' '/backup/path/data/(*)-[0-9A-Fa-f_]#.(*)' '/home/user/data/$1$2'

Если у вас нет zsh, способ POSIX использует pax (это рекурсивно копирует каталоги).

Если вы используете систему с ограниченным доступом без zsh и pax, вы можете использовать цикл:

for source in /backup/path/data/*-*.etf; do
  basename=${source##*/}
  cp "$source" "/home/user/data/${basename%-*}.${basename##*.}"
done

1

cpне имеет такой возможности. Я помню, cpioчто смог сделать это, но текущая страница руководства говорит иначе. Тем не менее, (GNU) tarимеет --transformвозможность:

 --transform, --xform EXPRESSION
       use sed replace EXPRESSION to transform file names

Таким образом, вы должны иметь следующую строку:

(cd /backup/path/data; tar --create --transform 's/-.*-....//' .) | (cd /home/user/data; tar --extract)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.