2016-09-06 3 views
3

У меня есть 5 файлов с именем file1.txt, file2.txt ... file5.txt, и я хотел бы переместить их в соответствующий каталог dir1, dir2 ... dir5.Переместить несколько файлов в несколько из нескольких каталогов

Таким образом file1.txt перемещается в каталог dir1, файл2.txt перемещается в каталог dir2 и т. Д.

Есть ли способ сделать это в одной строке в командной строке, используя mv и xargs возможно?

Я предлагаю только xargs, потому что мне очень нравится answer, предоставленный Robert Gamble, на вопрос, как копировать один файл в несколько каталогов.

echo dir1 dir2 dir3 | xargs -n 1 cp file1

ответ

0

Я бы лично предпочел решение, которое опирается на for петли, например:

for n in {1..5}; do echo mv -- "file$n.txt" "dir$n/"; done 
#     ^^^^ remove that 

Это может быть сделано с xargs, но я нахожу решение менее элегантно:

seq 1 5 | xargs -n1 -I{} echo mv -- "file{}.txt" "dir{}/" 
#      ^^^^ remove that 
+0

Это работает, спасибо! Я не думал об использовании 'echo', чтобы увидеть, какие команды будут выполняться на самом деле до выполнения на самом деле - я буду помнить об этом. Есть ли способ использовать ваше решение для файлов name fileA, fileB и т. Д.? – dlynch

+0

Просто сделайте 'для n в A B ...; do ... '. Кроме того, «эхо» должно было помочь мне отладить его. Я случайно оставил его там :-). Я рад, что это помогло. – redneb

+0

Спасибо за добавление 'xargs'. Что касается вопроса fileA, fileB и т. Д. Я не вижу, как предоставить команду с двумя входами. Следующее 'для n в {A..E}; do echo mv - "file $ n.txt" "dir $ n"; done' будет mv fileA.txt в dirA и т. д., но если бы я хотел переместить fileA.txt в dir1 - это возможно или это совсем другой вопрос? – dlynch

0

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

for f in *.txt; do mkdir dir${f: -5:1}; mv $f dir${f: -5:1}/; done 
0

Использование GNU Parallel вы бы так:

parallel mv {} {=s/file/dir/=} ::: *.txt 
Смежные вопросы