Я использую Bash на Mac 10.9.5. У меня есть файлы PDF во многих каталогах, все на одном уровне от корня ...

Dir_1/abc.PDF
Dir_2/def.PDF
Dir_3/ghi.PDF
Dir_3/jkl.PDF
...

Как мне написать команду оболочки, чтобы переместить все эти файлы в "корневой" каталог, то есть выровнять файлы рядом с дочерними каталогами ...

abc.PDF
def.PDF
ghi.PDF
Dir_1
Dir_2
Dir_3

?

3 ответа3

0
mv */*.PDF .

Это расширит список всех файлов с расширением .PDF во всех подкаталогах одного уровня глубиной, и переместить их в текущий каталог.

Сложность может возникнуть, если их так много, что вы получаете список аргументов ошибки argument list too long . В этом случае это будет работать, при условии, что в каталоге или именах файлов нет специальных символов, таких как пробелы, точки с запятой, кавычки и т.д.:

echo */*.PDF | xargs -i{} mv {} .

xargs создан для таких ситуаций: он принимает строки на входе, собирает столько, сколько будет выполнено за одно выполнение, а затем запускает команду, заданную в собранном списке. Здесь мы говорим xargs заменить {} на список.

0

Вы можете использовать find для этого:

find * -name "*.pdf" -maxdepth 1 -type f -exec mv {} ../ \;
  • -name "*.pdf" означает шаблон для сопоставления
  • -maxdepth 1 означает, что он пройдет только один уровень
  • -type f означает игнорировать все, что не является файлом (включая символические ссылки, каталоги и т. д.)
  • -exec mv {} ../ \; команда для выполнения для каждого найденного файла - если быть точным, то это команда mv <FILENAME> ../
0

Как насчет просто:

mv ./*/*.pdf .

Я провел тест на своем компьютере (zsh 5.0.7 (x86_64-pc-linux-gnu)), и он отлично работал:

> ls -r *    

sub3:
r.2  r.1

sub2:
s.2  s.1

sub1:
t.2  t.1

> mv ./*/*.pdf .
> ls
r.1  r.2  s.1  s.2  sub1  sub2  sub3  t.1  t.2


> tree                                                            
.
├── r.1
├── r.2
├── s.1
├── s.2
├── sub1
├── sub2
├── sub3
├── t.1
└── t.2

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