2014-02-04 5 views
0

Я использую csh, и у меня есть структура каталогов, содержащая несколько подкаталогов. Я пытаюсь переименовать все каталоги и подкаталоги, но не файлы внутри этих каталогов. Так что-то вродеПереименовать все подкаталоги в csh shell

От

topdir1 
--dir11 
--dir12 
topdir2 
--dir21 
----dir211 
--dir22 

в

topdir1.test 
--dir11.test 
--dir12.test 
topdir2.test 
--dir21.test 
----dir211.test 
--dir22.test 

Я могу перечислить каталоги с находкой. -maxdepth 3-тип d. Я пытаюсь использовать цикл foreach для их переименования. Так

foreach i (`find . -maxdepth 3 -type d`) 
mv $i $i.test 
end 

Но это не работает, как когда-каталог верхнего уровня переименовывается, он не может найти подкаталоги, так что переименовывает только верхние каталоги уровня.

Любая идея о том, как это сделать?

Thanks

ответ

2

Как насчет реверсирования результатов находят так что подкаталоги в списке первого?

foreach i (`find ./* -maxdepth 3 -type d | sort -r`) 
mv $i $i.test 
end 

Сортировать будут выводить длинные имена каталогов в прошлом, используя -r (реверс) флаг изменяет его таким образом, что самые низкие каталоги будут перечислены первыми, и переименовать, прежде чем их родительские каталоги делать.

+0

Спасибо. Это отлично работает. – user3271385

1

Используйте параметр -depth для поиска.

С Солярис человека найти страницу:

-depth    Always true. Causes descent of the 
        directory hierarchy to be done so that 
        all entries in a directory are acted on 
        before the directory itself. This can 
        be useful when find is used with cpio(1) 
        to transfer files that are contained in 
        directories without write permission. 
+0

не только из Solaris.Это стандартно: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/find.html#tag_20_47 –

0

Зачем использовать петлю? Просто дайте find сделать работу:

find . -depth -maxdepth 3 -type d -exec mv {} {}.test \; 

Это не является строго портативным (некоторые реализации находки могут юридически не расширять {}.test на строку, которую вы хотите, так что вы можете предпочесть:

find . -depth -maxdepth 3 -type d -exec sh -c 'mv $0 $0.test' {} \; 
+0

Я использую цикл, чтобы структура каталогов не изменялась, просто имена каталогов. Это не работает, поскольку все переименованные каталоги и подкаталоги помещаются в .tes t/ – user3271385

+0

Нет, он переименовывает каталоги в дереве так же, как ваш цикл. '{}' распространяется на относительный путь, а не на базовое имя. –

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