Я уже нашел много решений этой проблемы, но все они копируются и после удаления файлов. Мне нужна одна команда, которая перемещает или копирует и удаляет файл за файлом.

Я не слишком глубоко разбираюсь в командной строке, поэтому я мог справиться с этим ниже, но я не уверен, как удалить после копирования.

find . -name "*.extension" -exec cp --parent {} ../NewFolder/ \;

Использование OSX. Благодарю.

2 ответа2

1

Чтобы имитировать cp --parents , вам нужно использовать mkdir и mv вместе.

find . -name "*.extension" -exec sh -c 'dir=../NewFolder/$(dirname "{}"); mkdir -p "$dir" && mv -v "{}" "$dir"' \;

Подробная консольная нарезка-паста:

$ tree source
source
└── a
    ├── b
    │   ├── b.extension
    │   ├── c
    │   │   └── c.extension
    │   └── d
    └── e
        └── f
            └── f.extension

6 directories, 3 files
$ tree dest
dest

0 directories, 0 files
$ cd source
$ find . -name "*.extension" -exec sh -c 'dir=../dest/$(dirname "{}"); mkdir -p "$dir" && mv -v "{}" "$dir"' \;
'./a/e/f/f.extension' -> '../dest/./a/e/f/f.extension'
'./a/b/c/c.extension' -> '../dest/./a/b/c/c.extension'
'./a/b/b.extension' -> '../dest/./a/b/b.extension'
$ cd ..
$ tree source
source
└── a
    ├── b
    │   ├── c
    │   └── d
    └── e
        └── f

6 directories, 0 files
$ tree dest
dest
└── a
    ├── b
    │   ├── b.extension
    │   └── c
    │       └── c.extension
    └── e
        └── f
            └── f.extension

5 directories, 3 files
1

вместо того, чтобы просто копировать в свой exec, сделайте две вещи с "cp ..... && rm {} \;"

&& в bash означает «Выполнить эту команду следующим, только если предыдущая команда успешно завершилась (с кодом ошибки 0)

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