2016-03-28 9 views
1

В моих каталогах у меня есть несколько файлов с именем content. Мне нужно переименовать их с использованием точного имени родительского каталога, переместить его за пределы и удалить родительский каталог.Переименование файлов в нескольких каталогах на имя родительского каталога

Сложная часть - это форматы имен родительских каталогов: a.txt, b.pdf, c.mp3, поэтому содержимое файла необходимо переименовать в content.txt, content.pdf, content.mp3 впоследствии перемещено на улицу, а каталог следует удалить.

ex; 
INPUT 

a.txt/content 
b.pdf/content 
c.mp3/content 

OUTPUT 

a.txt 
b.pdf 
c.mp3 

Я использовал эту команду find и выдает желаемый выход эха. Я не уверен, куда идти оттуда.

find . -type d -not -empty -exec echo mv \{\}/content \{\} \; 

ответ

0

Сохранение файлов с расширением .bak в промежуточной стадии, а затем переименование до требуемого имени:

find . -mindepth 2 -type f -exec bash -c 'mv "$1" "${1%/*}".bak' _ {} \; \ 
     -exec bash -c 'rm -r "${1%/*}"' _ {} \; && rename 's/\.bak$//' *.bak 

Пример:

% tree              
. 
├── a.txt 
│   └── content 
├── b.pdf 
│   └── content 
└── c.mp3 
    └── content 

% find . -mindepth 2 -type f -exec bash -c 'mv "$1" "${1%/*}".bak' _ {} \; -exec bash -c 'rm -r "${1%/*}"' _ {} \; && rename 's/\.bak$//' *.bak 

% tree 
. 
├── a.txt 
├── b.pdf 
└── c.mp3 
+0

код создавал файлы a.txt.bak, b.pdf.bak и c.mp3.bak, но не переименовывал файлы в исходные расширения – Learner

+0

@Learner. Переименование в конце делает окончательное переименование, например. 'a.txt.bak' в' a.txt' .... проверьте, есть ли команда 'rename'. – heemayl

+0

У меня есть команда rename. Он дает ошибку Невозможно переименовать * .bak *: Нет такого файла или каталога. Я думаю, что он ищет расширение .bak в том месте, которого он не существует. – Learner

0

Я бы просто использовать для петля в маленьком скрипте.

#!/bin/bash 
DESTINATION=/home/whatever 
for dir in *; do 
    if [[ -e $dir/content ]]; then 
     mv $dir/content $DESTINATION/conent.${dir##*.} && rm -rf $dir 
    fi 
done 

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