2015-10-20 3 views
1

У меня есть папки с папками с подпапкой под палитрой под каждой папкой. Мне нужно изменить имя подпапки «thumbs» с помощью «большого пальца» под каждой подпапкой.SSH рекурсивно меняет имена всех подпапок на определенное имя.

я попытался

find . -type d -exec rename 's/^thumbs$/thumb/' {} ";" 

и я запускаю это в оболочке, когда я нахожусь в папке, которая содержит все вложенные папки, и каждый из этих подпапок содержит «пальцы» папку, в которой нужно переименовать с «большим ».

Я запустил эту команду и оболочку, оставив много времени на размышления, а затем я дал CTRL + C, чтобы остановить, но я проверил, и никакая папка не была переименована в текущий каталог, я не знаю, переименовал ли я папки вне каталога я был, может кто-то сказать мне, где я неправ с кодом?

+0

Пожалуйста, переместите свой вопрос в [su]. Здесь [вне темы] (http://stackoverflow.com/help/on-topic). –

+0

Я не знаю, как двигаться, я искал, но я не могу найти информацию. –

+0

Удалить здесь, переслать сообщение. –

ответ

0

Цель 1: Изменить подпапку "thumbs" на "thumb", если на уровне одного уровня.

Пример ввода:

./foo1/thumbs 
./foo2/thumbs 
./foo2/thumbs 

Решение:

find . -maxdepth 2 -type d | sed 'p;s/thumbs/thumb/' | xargs -n2 mv 

Выход:

./foo1/thumb 
./foo2/thumb 
./foo2/thumb 

Пояснение:

Используйте find, чтобы дать вам все «пальцы» папки только один уровень глубоко. Вытяните выход до sed. Опция p печатает строку ввода, а остальная часть команды sed изменяет «большие пальцы» на «большой палец». Наконец, труба до xargs. Опция -n2 сообщает xargs использовать два аргументов из трубы и передать их команде mv.

Выпуск:

Это не поймаешь более глубокие подкаталоги. Вы не можете просто не использовать глубину здесь, потому что find печатает результат сверху, и поскольку мы заменяем вещи с помощью sed, перед нами mv, mv приведет к ошибке для более глубоких подпапок. Например, ./foo/thumbs/thumbs/ не будет работать, потому что mv сначала позаботится ./foo/thumbs и сделает это ./foo/thumb, но затем следующая выходная строка приведет к ошибке, потому что ./foo/thumbs/thumbs/больше не существует.

Цель 2: Чтобы изменить все вложенные папки «превью» к «большой палец» независимо от того, насколько глубоко.

Пример ввода:

./foo1/thumbs 
./foo2/thumbs 
./foo2/thumbs/thumbs 
./foo2/thumbs 

Решение:

find . -type d | awk -F'/' '{print NF, $0}' | sort -k 1 -n -r | awk '{print $2}' | sed 'p;s/\(.*\)thumbs/\1thumb/' | xargs -n2 mv 

Выход:

./foo1/thumb 
./foo2/thumb 
./foo2/thumb/thumb 
./foo2/thumb 

Используйте find, чтобы предоставить вам все «большие пальцы» вложенных папок. Выполните вывод на awk, чтобы напечатать число '/' в каждом пути плюс исходный вывод. sort вывод численно, в обратном порядке (чтобы поместить самые глубокие дорожки сверху) на число '/' s. Выполните сортировку списка до awk, чтобы удалить счетчики из каждой строки. Вытяните выход до sed. Опция p печатает строку ввода, а остальная часть команды sed находит последнее появление «больших пальцев» и изменяет только его на «большой палец». Поскольку мы работаем с отсортированным списком в порядке от самого глубокого до самого низкого уровня, это обеспечит mv правильными командами. Наконец, труба до xargs. Опция -n2 сообщает xargs использовать два аргументов из трубы и передать их команде mv.

+0

ну, большое спасибо. –