2015-06-22 2 views
1

У меня есть файл настроек, который нужно переместить в соответствующее место. например. settings.location1, settings.location2, settings.location3, которым необходимо перейти в соответствующие папки, а именно location1, location2 и location3, и их переименовать в простые настройки.Используйте find exec с sed, чтобы заменить часть имени файла и скопировать его

например.

/some/path/settings.location1 ->/другие/путь/LOCATION1/Настройки

/some/path/settings.location2 ->/другие/путь/LOCATION2/Настройки

Я пришел со следующим номером:

find /some/path/settings.* -exec cp {} /other/path/$(echo {} | sed 's/.*\.//')/settings \; 

Но по какой-то причине sed не выполняется. И результат:

cp: cannot create regular file `/other/path//some/path/settings.location1/settings': No such file or director 

Кажется, что если я запускаю их отдельно, все команды выполняются хорошо, но не если я вставляю exec. Что я делаю не так?

+0

Привет, это/другие/путь/некоторые/путь уже существует? В противном случае cp не будет создавать промежуточную папку для завершения пути. Также: учтите, что результатом поиска является полный путь, а не только имя файла. –

+0

Привет, Франческо, нет, этого не существует, но все дело в том, что он должен генерировать назначение как/other/path/location1/settings, а не размещать здесь весь «/ some/path». И/other/path/location1 существует. – teapothat

+1

Ваш '$ (echo ...)' выполняет * один раз *, когда запускается команда 'find'. Вы хотите, чтобы он запускался один раз для каждого значения '{}', но этого не происходит. Для этого вам нужно заставить оболочку использовать команду '-exec''d. –

ответ

0

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

Вы можете попробовать:

find /some/path/settings.* -exec mkdir -p /other/path/$(ls -m1 {})/ && cp {} /other/path/$(ls -m1 {})/settings \; 
+0

Привет, Франческо, расположение папок1 и location2 уже существуют. Мне просто нужно сопоставить папку settings.location1 и location1. а также в этом случае мне нужна только часть после. ls -m1, как я понимаю, дает вам полное имя файла? – teapothat

+0

Зачем вам 'ls'? – anishsane

+0

Да @teapothat ls -m1 получает только имя файла (настройки * в вашем случае). Директив будет создан, если не существует (-p), а файл скопирован по вновь созданной папке. –

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