Ubuntu: Copy files from a directory to a sub-directory (excluding the sub-directory itself)


I have created a folder (directory) named Parent which contains several files (namely file1 file2 ... file100) and subdirectories (Folder2, Folder3 etc) and a particular sub-directory named Child1 which itself may contain files and folders. Now, I want to copy all the contents of Parent excluding Child1 into the folder Child1.

The final content of 'Child1' should be something like this:

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

How can I achieve this?


Assuming you are using bash as your interactive shell, you can enable extglob which allows you to specify "all files except these ones".

shopt -s extglob  cd Parent  cp !(Child1) Child1/  


Three excellent answers that demonstrate the flexibility of linux. And it's always a good idea to be familiar with basic command line operations. Personally I prefer a hybrid approach and I try using mc (midnight commander) when it's available.

sudo apt-get install mc  

will get it for you. Surviving tyrannosaurs like me might notice the resemblance with Norton commander from the DOS days. Its operation is quite intuitive. You have two panels. You switch between them with TAB. There are Fn key shortcuts for basic operations, like view, edit, copy, move, rename, delete, etc.


In your case, all you have to do is type mc in your terminal window and navigate to Parent folder in one panel, child folder on the other. Then select parent panel and press + and then enter. This will select all files and folders in the panel. With arrow keys go on top of Child1 folder and press Ins key. This will de-select that folder (Ins key toggles select status of an item.) Now press F5 and all selected content will be copied to the other panel (which is inside Child1 folder.)

I am providing this information only for the sake of completeness and to further demonstrate the variety of solutions available. By all means, go on and learn the basic linux commands and their variations. You can always rely on them being available at your fingertip on any system.


Try :

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

There will be a message that cp omitted the "Child1" directory.


Less elegant than extglob, but also works...

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  

Remove echo after testing to actually move the files. If you have hidden files and want to include them, first run shopt -s dotglob.

As a script (again, you need to remove echo to actually move files):

#!/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  


rsync has an option to exclude files or directories using --exclude option.

So in this case I think rsync would be a nice choice.

mkdir -p Child1; rsync -av --progress ./* Child1 --exclude Child1  


If the files are actually called 'file1' etc., you can do this:

cd Parent  cp file* Child1/  

Otherwise you'll have to list the files in the cp command.


The simplest way is to move the Child1 directory elsewhere, temporarily:

cd Parent  mv Child1 ..  mv * ../Child1  mv ../Child1 .  


find Parent/ -maxdepth 1 -type f | xargs cp -t Parent/Child/  

This finds all files (excluding directory) inside your Parent/ directory and copies each of those files to 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  


You can use ls to list the contents of "Parent",

pipe the result to grep -v to filter out "Child1",

and then send the resulting list to cp.

This should do the trick: (from within the "Parent" dir)

cp `ls | grep -v '^Child1$'` Child1

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Next Post »