2013-08-19 5 views
0

Я хотел бы переименовать файл в каталоге на основе части имени каталога. У меня есть следующая структура:Переименовать файл на основе имени каталога с помощью zsh

Sample_1234/all_R2.gz 
Sample_2345/all_R2.gz 
Sample_3456/all_R2.gz 

В каждом каталоге я создаю новый файл из конкатенации нескольких других файлов. Затем я хотел бы назвать новый согласованный файл, используя только часть номера имени каталога. Например,

Sample_1234/1234_R2.gz 
Sample_2345/2345_R2.gz 
Sample_3456/3456_R2.gz 

я могу вернуть часть имени каталога, что я хочу с:

pwd | grep -o '[0-9][0-9][0-9][0-9]' 

Но я не могу получить это в новое имя файла с помощью ZMV. Любые предложения в оболочке zsh? Спасибо,

ответ

2

Не используйте find, используйте zmv. Используйте пары () для захвата бит нужного имени файла и ${1}, ${2} и т. Д., Чтобы ссылаться на них. Вот моя структура папок:

$ ls **/* 
Sample_1234/all_R2.gz Sample_4567/all_R2.gz 
Sample_2345/all_R2.gz Sample_6890/all_R2.gz 

Sample_1234: 
all_R2.gz 

Sample_2345: 
all_R2.gz 

Sample_4567: 
all_R2.gz 

Sample_6890: 
all_R2.gz 

И вот zmv, assuming you've got it loaded:

$ zmv -n 'Sample_(*)/all_R2.gz' 'Sample_${1}/${1}_R2.gz' 
mv -- Sample_1234/all_R2.gz Sample_1234/1234_R2.gz 
mv -- Sample_2345/all_R2.gz Sample_2345/2345_R2.gz 
mv -- Sample_4567/all_R2.gz Sample_4567/4567_R2.gz 
mv -- Sample_6890/all_R2.gz Sample_6890/6890_R2.gz 

Она захватывает все между _ и / в имени файла из текущего каталога, что позволяет ссылаться на номер string в конце имени каталога. Затем мы вставляем это обратно в имя файла, используя ${1} для ссылки, заменяя all.

Это хорошо, стоит использовать zmv -n, чтобы узнать, что произойдет, прежде чем вы это сделаете.

+0

Большое спасибо за ваш ответ. По какой-то причине я не видел. Все еще полезно. – user1148636

Смежные вопросы