Как я могу использовать терминал Linux для копирования всего в текущем каталоге в подкаталог?
Как я могу использовать терминал Linux для копирования всего в текущем каталоге в подкаталог?
Ответы:
Если вы хотите скопировать содержимое папки рекурсивно (выдаст 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
find
кодом: D
xargs
или -exec
. Нет необходимости grep
- использовать ! -name "$TARGETDIR"
или подобное. У вас есть непревзойденные цитаты вокруг $file
. Я не думаю, что рекурсив cp
будет работать так, как вы намерены в любой, кроме вашей первой команды.
Предположим, 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 и т. д.
Будет ли это работать для вас?
cp -r * subdir/
Если вы хотите переместить вместо копирования все содержимое текущего каталога в подкаталог, вы можете сделать следующее:
mv * subdir/
Это скопирует все, включая точечные файлы, и не включая сам целевой каталог, в целевой каталог SUBDIR
:
for i in `ls -a | grep -Ev '^(SUBDIR|\.\.?)$'`; do cp $i SUBDIR; done
Это идет, скажем, в файле dirCopy.sh
for i in `ls`
do
if [ $i != "subDir" ]
then
`cp -r $i subDir`
fi
done
запустите его как "sh dirCopy.sh" в вашей консоли
ls
: for file in *
. Нет необходимости в кавычках - используйте $()
. Нет необходимости использовать обратные метки (или $()
) вокруг cp
команды (которая выдаст сообщение об ошибке).