это не работает, если 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/.
Я бы предложил переместить целевой каталог за пределы исходного каталога, а затем снова поместить его; mv свободен (если вы осторожны, чтобы не переходить на другую файловую систему), если только вы не ожидаете, что другие процессы будут вмешиваться / вмешиваться.
Большинство решений, опубликованных выше, не будут работать, если в именах файлов есть пробелы. Я бы предложил использовать варианты find -print0 | xargs -0 или найти -exec и т. д.
Нет необходимости ls: for file in *. Нет необходимости в кавычках - используйте $(). Нет необходимости использовать обратные метки (или $()) вокруг cpкоманды (которая выдаст сообщение об ошибке).
Ответы:
Если вы хотите скопировать содержимое папки рекурсивно (выдаст 1 ошибку, варианты ниже):
Немного более хакерский, но работает с непустыми подкаталогами:
Еще один вкладчик:
Или рекурсивный:
источник
find
кодом: Dxargs
или-exec
. Нет необходимостиgrep
- использовать! -name "$TARGETDIR"
или подобное. У вас есть непревзойденные цитаты вокруг$file
. Я не думаю, что рекурсивcp
будет работать так, как вы намерены в любой, кроме вашей первой команды.Предположим,
target
это имя целевого подкаталога, если ваша оболочка bash:В ksh вы можете напрямую это сделать
cp -r !(target) target/
.В Zsh вы можете сделать
setopt ksh_glob
тоcp -r !(target) target/
. Другая возможностьsetopt extended_glob
тогдаcp -r ^target target/
.источник
Я бы предложил переместить целевой каталог за пределы исходного каталога, а затем снова поместить его; mv свободен (если вы осторожны, чтобы не переходить на другую файловую систему), если только вы не ожидаете, что другие процессы будут вмешиваться / вмешиваться.
Большинство решений, опубликованных выше, не будут работать, если в именах файлов есть пробелы. Я бы предложил использовать варианты find -print0 | xargs -0 или найти -exec и т. д.
источник
Будет ли это работать для вас?
Если вы хотите переместить вместо копирования все содержимое текущего каталога в подкаталог, вы можете сделать следующее:
источник
Это скопирует все, включая точечные файлы, и не включая сам целевой каталог, в целевой каталог
SUBDIR
:источник
Это идет, скажем, в файле dirCopy.sh
запустите его как "sh dirCopy.sh" в вашей консоли
источник
ls
:for file in *
. Нет необходимости в кавычках - используйте$()
. Нет необходимости использовать обратные метки (или$()
) вокругcp
команды (которая выдаст сообщение об ошибке).