12

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

6 ответов6

10

Если вы хотите скопировать содержимое папки рекурсивно (выдаст 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
4

Предположим, target - это имя подкаталога 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/
-1

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



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

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

-1

Это скопирует все, включая точечные файлы, и не включая сам целевой каталог, в целевой каталог SUBDIR:

for i in `ls -a | grep -Ev '^(SUBDIR|\.\.?)$'`; do cp $i SUBDIR; done

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