Як я можу використовувати термінал 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 безкоштовний (якщо ви обережні, щоб не переходити до іншої файлової системи), якщо ви не очікуєте, що інші процеси будуть втручатися / втручатися.
Більшість рішень, розміщених вище, не працюватимуть, якщо є пробіли у іменах. Я б запропонував використовувати варіанти знаходження -print0 | xargs -0, або знайти -exec тощо.
Це буде працювати для вас?
cp -r * subdir/
Якщо ви мали намір перейти замість того, щоб копіювати все, що знаходиться в поточному режимі, у підкаталог, ви можете зробити:
mv * subdir/
Це скопіює все, включаючи крапкові файли, не включаючи сам цільовий каталог, у цільовий каталог SUBDIR
:
for i in `ls -a | grep -Ev '^(SUBDIR|\.\.?)$'`; do cp $i SUBDIR; done
Про це йдеться у файлі say 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
команди (що створюватиме повідомлення про помилку).