Вопрос

Предполагая, что у меня есть

dir 1/dir 2/file 1
dir 3/dir 4/file 2

(пробелы в именах каталогов и файлов являются преднамеренными)

Я хочу закончить с

dir 1/file 1
dir 3/file 2

Связанные, но неполные ответы

Этот ответ перемещает все файлы в текущий родительский каталог (вместо родительского каталога каждого файла)

find . -maxdepth 1 -exec mv {} .. \;

Этот ответ распечатывает каждый родительский каталог, но я не уверен, как сделать перемещение.

find . -name '.user.log' | xargs -I{} dirname {}

3 ответа3

4
find -type f -execdir mv "{}" ../ \;

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

Чтобы избавиться от пустых dir2 и dir4 в вашем примере, вам нужна другая специализированная команда, но основная задача выполнена.

0

for x in */* ; do [ -d $x ] && ( echo cd $x ; echo pwd ; echo mv * .. ; echo cd ../.. ) ; done

Как то, что вы видите? Затем удалите слово echo (из нескольких мест)

Может работать не во всех случаях, например, если используются символические ссылки. Протестировано с OpenBSD ksh (предварительные результаты выглядели хорошо при ручном визуальном осмотре - я не удалял echo команды).

Обратите внимание, что [ это команда; он использует ту же man-страницу, что и test (хотя, поскольку это внутренняя команда для вашей оболочки, вам нужно использовать man-страницу для вашей оболочки и искать документацию по этой команде.)

0

Вы начали правильно. Однако вы можете немного расширить его в сочетании с -type предиката, чтобы получить только файлы. Используя xargs и обильные возможности bash вас есть

find . -maxdepth 3 -mindepth 3 -type f |xargs -n1 bash -c 'cd $(dirname $0) ; mv $0 ..'

$0 - это позиционный аргумент, переданный в bash xargs. Чтобы посмотреть, как это происходит, вы можете использовать опцию -t для xargs как -tn1

Примечание: я ограничил глубину поиска с помощью -mindepth $D и -maxdepth $D , не стесняйтесь изменять в соответствии с вашими требованиями.

Примечание 2: ответ Камиля (использование -execdir на самом деле является гораздо лучшим решением).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .