Копіювання вмісту поточного каталогу у підкаталог


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буде працювати так, як ви плануєте в будь-якій, крім вашої першої команди.
Призупинено до подальшого повідомлення.

Воха, пропустив цитату в останніх кодах. Добрий коментар Деннісе, я ніколи не думав використовувати -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 безкоштовний (якщо ви обережні, щоб не переходити до іншої файлової системи), якщо ви не очікуєте, що інші процеси будуть втручатися / втручатися.

Більшість рішень, розміщених вище, не працюватимуть, якщо є пробіли у іменах. Я б запропонував використовувати варіанти знаходження -print0 | xargs -0, або знайти -exec тощо.


0

Це буде працювати для вас?

cp -r * subdir/

Якщо ви мали намір перейти замість того, щоб копіювати все, що знаходиться в поточному режимі, у підкаталог, ви можете зробити:

mv * subdir/

це не піклується про непорожні каталоги

Я тільки тестував, і це спрацювало.
karlphillip

вам потрібно копіювати непорожні каталоги рекурсивно, як запропонував @Lekensteyn.


-1

Про це йдеться у файлі say 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.