Копировать файлы из каталога в подкаталог (исключая сам подкаталог)

Я создал папку (директорию) с именем Parent, которая содержит несколько файлов (а именно file1 file2 ... file100) и подкаталоги (Folder2, Folder3 и т. Д.) И определенную подпапку. -директория с именем Child1, которая сама может содержать файлы и папки. Теперь я хочу скопировать все содержимое Parent, за исключением Child1, в папку Child1.

Конечное содержание «Child1» должно быть примерно таким:

 Old content of Child1
 file1 ... file100 + Folder2 Folder3 + etc.

Как мне этого добиться?

3
задан 12 December 2017 в 17:41

9 ответов

Предполагая, что вы используете bash в качестве интерактивной оболочки, вы можете включить extglob , который позволяет вам указать «все файлы, кроме этих».

shopt -s extglob
cd Parent
cp !(Child1) Child1/
0
ответ дан 12 December 2017 в 17:41

Попробуйте:

cd [WhereeverParentLies]
cp ./* ./Child1/

Появится сообщение, в котором cp опущен каталог «Child1».

0
ответ дан 12 December 2017 в 17:41

Три отличных ответа, которые демонстрируют гибкость Linux. И всегда полезно ознакомиться с основными операциями командной строки. Лично я предпочитаю гибридный подход и пытаюсь использовать mc (полночный командир), когда он доступен.

sudo apt-get install mc

получит это для вас. Выжившие тиранозавры, такие как я, могут заметить сходство с командиром Нортона со времен ДОС. Его работа довольно интуитивно понятна. У вас есть две панели. Вы переключаетесь между ними с помощью клавиши TAB. Существуют сочетания клавиш Fn для основных операций, таких как просмотр, редактирование, копирование, перемещение, переименование, удаление и т. Д.

mc

В вашем случае все, что вам нужно сделать, это набрать mc в окне терминала и перейти к папке «Родитель» на одной панели, дочерней папке на другой. Затем выберите родительскую панель и нажмите +, а затем введите. Это позволит выбрать все файлы и папки на панели. С помощью клавиш со стрелками перейдите в верхнюю часть папки Child1 и нажмите клавишу Ins. Это отменит выбор этой папки (клавиша Ins переключает выбор состояния элемента.) Теперь нажмите F5, и весь выбранный контент будет скопирован на другую панель (которая находится в папке Child1.)

Я предоставляю это информация только для полноты и дальнейшей демонстрации разнообразия доступных решений. Обязательно изучите основные команды linux и их варианты. Вы всегда можете рассчитывать на их доступность в любой системе.

0
ответ дан 12 December 2017 в 17:41

rsync имеет возможность исключать файлы или каталоги, используя опцию --exclude.

Так что в этом случае я думаю, что rsync будет хорошим выбором.

mkdir -p Child1; rsync -av --progress ./* Child1 --exclude Child1
0
ответ дан 12 December 2017 в 17:41

Менее элегантный, чем extglob, но также работает ...

mkdir -p Child1; for i in ./*; do [[ "$i" != ./Child1 ]] && echo cp -vr "$i" Child; done
cp -vr ./file1 Child1
cp -vr ./file100 Child1
cp -vr ./Folder2 Child1
cp -vr ./Folder3 Child1

Удалите echo после тестирования, чтобы фактически переместить файлы. Если у вас есть скрытые файлы и вы хотите включить их, сначала запустите shopt -s dotglob.

В качестве сценария (опять же, вам нужно удалить echo для фактического перемещения файлов):

#!/bin/bash

mkdir -p Child1                    # create Child1 if it does not exist
for i in ./*; do                   # act on all the files in the current directory 
   [[ "$i" != ./Child1 ]] &&       # if the file is not Child1 itself
   echo cp -vr "$i" Child1         # move the file into Child1
done
0
ответ дан 12 December 2017 в 17:41

Если файлы на самом деле называются «file1» и т. Д., Вы можете сделать это:

cd Parent
cp file* Child1/

В противном случае вам придется перечислить файлы в команде cp.

0
ответ дан 12 December 2017 в 17:41

Самый простой способ - временно переместить каталог Child1 в другое место:

cd Parent
mv Child1 ..
mv * ../Child1
mv ../Child1 .
0
ответ дан 12 December 2017 в 17:41
find Parent/ -maxdepth 1 -type f | xargs cp -t Parent/Child/

Это находит все файлы (кроме каталога) в вашем каталоге Parent / и копирует каждый из этих файлов в Parent / Child

find

    -type f match file only
    -maxdepth 1 find only in the Parent/ directory, do not find in directories inside Parent

cp

    -t target the directory where you want to copy the files
0
ответ дан 12 December 2017 в 17:41

Вы можете использовать ls для вывода списка содержимого «Parent»,

перенаправить результат в grep -v, чтобы отфильтровать «Child1»,

, а затем отправить полученный список. до cp.

Это должно сработать: (изнутри «Родительского» каталога)

cp `ls | grep -v '^Child1` Child1
0
ответ дан 12 December 2017 в 17:41

Другие вопросы по тегам:

Похожие вопросы: