Копирование содержимого текущего каталога в подкаталог


13

Как я могу использовать терминал Linux для копирования всего в текущем каталоге в подкаталог?


Вы имеете в виду копирование или перемещение?
Крейг

Ответы:


12

Если вы хотите скопировать содержимое папки рекурсивно (выдаст 1 ошибку, варианты ниже):

cp -r * sub/

Немного более хакерский, но работает с непустыми подкаталогами:

TARGETDIR='targetdir here';cp -r `find . -maxdepth 1 ! -name "$TARGETDIR"` "$TARGETDIR"

Еще один вкладчик:

TARGETDIR='targetdir here';for file in *;do test "$file" != "$TARGETDIR" && cp "$file" "$TARGETDIR/";done

Или рекурсивный:

TARGETDIR='z';for file in *;do test "$file" != "$TARGETDIR" && cp -r "$file" "$TARGETDIR/";done

это не работает, если sub / не пустой -> sub снова будет скопирован в sub, если это не то, что хотел @Oguz.

Хорошо, я наконец-то доволен findкодом: D
Лекенштейн

2
Ваша вторая команда не выполняется для имен файлов, которые содержат пробелы. Используйте xargsили -exec. Нет необходимости grep- использовать ! -name "$TARGETDIR"или подобное. У вас есть непревзойденные цитаты вокруг $file. Я не думаю, что рекурсив cpбудет работать так, как вы намерены в любой, кроме вашей первой команды.
Приостановлено до дальнейшего уведомления.

Wohaa, пропустил цитату в последних кодах. Хороший комментарий Деннис, я никогда не думал об использовании -name в этом случае :)
Lekensteyn

4

Предположим, targetэто имя целевого подкаталога, если ваша оболочка bash:

shopt -s extglob
cp -r !(target) target/

В ksh вы можете напрямую это сделать cp -r !(target) target/.

В Zsh вы можете сделать setopt ksh_globто cp -r !(target) target/. Другая возможность setopt extended_globтогда cp -r ^target target/.


2

Я бы предложил переместить целевой каталог за пределы исходного каталога, а затем снова поместить его; mv свободен (если вы осторожны, чтобы не переходить на другую файловую систему), если только вы не ожидаете, что другие процессы будут вмешиваться / вмешиваться.

Большинство решений, опубликованных выше, не будут работать, если в именах файлов есть пробелы. Я бы предложил использовать варианты find -print0 | xargs -0 или найти -exec и т. д.


0

Будет ли это работать для вас?

cp -r * subdir/

Если вы хотите переместить вместо копирования все содержимое текущего каталога в подкаталог, вы можете сделать следующее:

mv * subdir/

это не заботится о непустых каталогах

Я только что проверил, и это сработало.
karlphillip

вам нужно копировать непустые каталоги рекурсивно, как предложено @Lekensteyn.


-1

Это идет, скажем, в файле dirCopy.sh



for i in `ls`
do
        if [ $i != "subDir" ]
        then
                `cp -r $i subDir`
        fi
done

запустите его как "sh dirCopy.sh" в вашей консоли


2
Нет необходимости ls: for file in *. Нет необходимости в кавычках - используйте $(). Нет необходимости использовать обратные метки (или $()) вокруг cpкоманды (которая выдаст сообщение об ошибке).
Приостановлено до дальнейшего уведомления.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.