2015-03-25 7 views
0

Предположим, у меня есть две папки (хранящиеся в моем домашнем каталоге) dir1 и dir2 и те, которые содержат файл с тем же именем, скажем hello_world.txt. Содержимое каждого файла hello_world.txt составляет другой, однако.Подстановочные знаки в bash

я могу сделать

ls dir*/hello_world.txt 
dir1/hello_world.txt dir2/hello_world.txt 

который бы перечислить эти два файла. Замечательно! Но ...

, как я могу сделать копию двух файлов, используя * джокер, и повторно именования их однозначно в то же время. I.e. Я хочу, чтобы выход был

hello_world1.txt hello_world2.txt 

и для того, чтобы быть в моем домашнем каталоге.

+1

Вы можете использовать цикл 'for'. – user4098326

+0

@ user4098326 Я мог бы, но это связано с необходимостью писать более одной строки. Нет ли более простого способа? –

+0

Одна строка не всегда означает более простой. Короче не всегда лучше. –

ответ

2

для цикла действительно является лучшим решением здесь: Это понятно, ремонтопригодны, и, несмотря на многострочный, очень просто:

i=0 
for hw in dir*/hello_world.txt; do 
    dest="$HOME/${hw##*/}" 
    cp "$hw" "${dest%.*}$((++i)).txt" 
done 

Входы:

$ tree 
. 
├── dir1 
│   └── hello_world.txt 
└── dir2 
    └── hello_world.txt 

Выходы:

$ tree 
. 
├── dir1 
│   ├── hello_world.txt 
└── dir2 
    └── hello_world.txt 
$ (cd ~ && tree) 
. 
├── hello_world1.txt 
└── hello_world2.txt 
+0

Так близко! OP также запросил, чтобы скопированные файлы были помещены в их домашний каталог. Может быть, введите «basename»? –

+0

@ Mr.Llama нормально, обновлено. – kojiro

0

GNU Coreutils имеет опцию -b до cp, что позволяет вам id перезаписи файлов.

cp -b numbered dir*/hello_world.txt $HOME 

Однако это не дает полного контроля над сгенерированными именами.

Для получения подробной документации см. info coreutils cp и Backup options в документации Coreutils.