Я создал папку (директорию) с именем Parent
, которая содержит несколько файлов (а именно file1
file2
... file100
) и подкаталоги (Folder2
, Folder3
и т. Д.) И определенную подпапку. -директория с именем Child1
, которая сама может содержать файлы и папки. Теперь я хочу скопировать все содержимое Parent
, за исключением Child1
, в папку Child1
.
Конечное содержание «Child1» должно быть примерно таким:
Old content of Child1
file1 ... file100 + Folder2 Folder3 + etc.
Как мне этого добиться?
Предполагая, что вы используете bash в качестве интерактивной оболочки, вы можете включить extglob , который позволяет вам указать «все файлы, кроме этих».
shopt -s extglob
cd Parent
cp !(Child1) Child1/
Попробуйте:
cd [WhereeverParentLies]
cp ./* ./Child1/
Появится сообщение, в котором cp опущен каталог «Child1».
Три отличных ответа, которые демонстрируют гибкость Linux. И всегда полезно ознакомиться с основными операциями командной строки. Лично я предпочитаю гибридный подход и пытаюсь использовать mc (полночный командир), когда он доступен.
sudo apt-get install mc
получит это для вас. Выжившие тиранозавры, такие как я, могут заметить сходство с командиром Нортона со времен ДОС. Его работа довольно интуитивно понятна. У вас есть две панели. Вы переключаетесь между ними с помощью клавиши TAB. Существуют сочетания клавиш Fn для основных операций, таких как просмотр, редактирование, копирование, перемещение, переименование, удаление и т. Д.
В вашем случае все, что вам нужно сделать, это набрать mc в окне терминала и перейти к папке «Родитель» на одной панели, дочерней папке на другой. Затем выберите родительскую панель и нажмите +, а затем введите. Это позволит выбрать все файлы и папки на панели. С помощью клавиш со стрелками перейдите в верхнюю часть папки Child1 и нажмите клавишу Ins. Это отменит выбор этой папки (клавиша Ins переключает выбор состояния элемента.) Теперь нажмите F5, и весь выбранный контент будет скопирован на другую панель (которая находится в папке Child1.)
Я предоставляю это информация только для полноты и дальнейшей демонстрации разнообразия доступных решений. Обязательно изучите основные команды linux и их варианты. Вы всегда можете рассчитывать на их доступность в любой системе.
rsync
имеет возможность исключать файлы или каталоги, используя опцию --exclude
.
Так что в этом случае я думаю, что rsync
будет хорошим выбором.
mkdir -p Child1; rsync -av --progress ./* Child1 --exclude Child1
Менее элегантный, чем 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
Если файлы на самом деле называются «file1» и т. Д., Вы можете сделать это:
cd Parent
cp file* Child1/
В противном случае вам придется перечислить файлы в команде cp.
Самый простой способ - временно переместить каталог Child1
в другое место:
cd Parent
mv Child1 ..
mv * ../Child1
mv ../Child1 .
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
Вы можете использовать ls
для вывода списка содержимого «Parent»,
перенаправить результат в grep -v
, чтобы отфильтровать «Child1»,
, а затем отправить полученный список. до cp
.
Это должно сработать: (изнутри «Родительского» каталога)
cp `ls | grep -v '^Child1` Child1