- How to move multiple files at once to a specific destination directory?
- 15 Answers 15
- Linux fundamentals: How to copy, move, and rename files and directories
- Move files and directories
- Rename files and directories
- Copy files and directories
- Great Linux resources
- More to explore
- How to move all files and folders via mv command [duplicate]
How to move multiple files at once to a specific destination directory?
I got a bunch of files in some directory (along with many other files) that I want to move. Luckily, all the files I want to move contain a certain identifier in their names, so I can ls | grep IDENTIFIER to get the exact list of files to move. But, how can I execute mv file /path/to/dest/folder/ at once, and not one by one (there’s a lot of files to move)?
15 Answers 15
mv -t DESTINATION file1 file2 file3
The following also works, but I’m not sure if mv is invoked multiple times or not, as grep will output a new line for each match:
mv -t DESTINATION `ls|grep IDENTIFIER`
Does not work on Mac (10.11.16 El Capitan). But you can simply put the target folder at the back, i.e. mv file1 file2 . destination
If you want to move ABC-IDENTIFIER-XYZ.ext or IDENTIFIER-XYZ.xml , you can use:
* is a wildcard for zero or more characters, this means zero or more characters, followed by IDENTIFIER , followed by zero or more characters.
This will move all the files that contain the IDENTIFIER you specified.
Fore example, to move all files having a .doc extension:
This will move all doc file under the current directory to the specific destination.
but the list of files to move is not determined by extension. some of the files are named: ABC-IDENTIFIER-XYZ.ext and some just IDENTIFIER-XYZ.ext all having different extensions, mostly xml or properties .
mv *.ext *.xml *.txt /path/to/dest/folder/
but the list of files to move is not determined by extension. some of the files are named: ABC-IDENTIFIER-XYZ.ext and some just IDENTIFIER-XYZ.ext all having different extensions, mostly xml or properties .
If you want to move a set of arbitrary files (no common pattern in the names and types) you can do as Mr. Rajanand said: first go to the directory that contains the files you want to move
mv file1.ext1 file2.ext2 file3.ext3 /destination/
In case the files are scattered in different directories, you only need to specify the path for each file in the mv command.
If the files are in the same dir you can use
mv /path/to/source/dir/ /path/to/destination/
I use tuomaz’s technique, but slightly modified:
mv file1 file2 file3 -t DESTINATION
I find this easier to remember and harder to screw up since it uses the same ordering as the vanilla mv operation:
mv `ls|grep IDENTIFIER` /path/to/dest/folder
However, ls is not recommended for this kind of use. Use find command instead.
ls is not recommended for this kind of use. If you want to list files, especially with a grep behind, use find . -name \*IDENTIFIER\* .
This answer was just to demonstrate how you can use the output of previous command in mv. As ls|grep was mentioned in the question, I just copied it.
find -type f -name "[range]" -exec mv <> target-directory ';'
this command will move file names with any pattern/range to target-directory.
find -type f -name "file24999" -exec mv <> target-directory ';'
it will move files with names like file1 , file2 . file50000 to target-directory .
given the example in the question, I just want to put a note here on character classes — [range] (literally) will match r or a or n or g or e, so [IDENTIFIER] (whatever OP’s identifier is) would probably not do the thing expected. Better to run find without -exec first to see what files will be operated on.
If you have so many files to move you can actually have too many for the mv command (or other commands like rm ). I suggest using xargs to move each file individually in a loop like fashion. One way to get around that is to do:
ls -1 | grep IDENTIFIER | xargs -i mv <> /path/to/dest/folder/
The ls -1 (minus one) ensures that there is only one filename on each line. If you have hidden aliases for the ls command you can have multiple filenames on a single line and inadvertently move a file you did not intend to move.
Linux fundamentals: How to copy, move, and rename files and directories
Copying, moving, and renaming files and directories are standard tasks for sysadmins and end users. Depending on your Linux distribution, you can accomplish these operations in various ways.
The Bash shell is usually the most efficient tool for file management. This article assumes you already have a basic understanding of how to open a Linux terminal and enter commands. (See How to access the Linux terminal if you want a refresher.) Connect to your Linux terminal with your regular user account, and get ready to reorganize.
Change to your home directory and create a new directory named mydir for the exercises. The command to create a new directory is mkdir :
Move files and directories
The mv command moves both directories and files. Check its options and parameters from the —help results below:
$ mv --help Usage: mv [OPTION]. [-T] SOURCE DEST or: mv [OPTION]. SOURCE. DIRECTORY or: mv [OPTION]. -t DIRECTORY SOURCE. Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY. Mandatory arguments to long options are mandatory for short options too. --backup[=CONTROL] make a backup of each existing destination file -b like --backup but does not accept an argument -f, --force do not prompt before overwriting -i, --interactive prompt before overwrite -n, --no-clobber do not overwrite an existing file If you specify more than one of -i, -f, -n, only the final one takes effect. --strip-trailing-slashes remove any trailing slashes from each SOURCE argument -S, --suffix=SUFFIX override the usual backup suffix -t, --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY -T, --no-target-directory treat DEST as a normal file -u, --update move only when the SOURCE file is newer than the destination file or when the destination file is missing -v, --verbose explain what is being done -Z, --context set SELinux security context of destination file to default type --help display this help and exit --version output version information and exit The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX. The version control method may be selected via the --backup option or through the VERSION_CONTROL environment variable. Here are the values: none, off never make backups (even if --backup is given) numbered, t make numbered backups existing, nil numbered if numbered backups exist, simple otherwise simple, never always make simple backups
Rename files and directories
You also use the mv command to rename directories and files if the destination doesn’t already exist. If the destination exists, then they’re moved using the syntax mv . Here is an example of moving existing files to existing directories:
$ ls -l total 0 drwxrwxr-x. 2 localuser localuser 6 Jun 9 14:57 dir1 drwxrwxr-x. 2 localuser localuser 6 Jun 9 17:52 dir2 drwxrwxr-x. 2 localuser localuser 6 Jun 9 17:52 dir3 drwxrwxr-x. 3 localuser localuser 21 Jun 9 16:57 dir4 -rw-rw-r--. 1 localuser localuser 0 Jun 9 17:31 file1 -rw-rw-r--. 1 localuser localuser 0 Jun 9 17:33 file2 -rw-rw-r--. 1 localuser localuser 0 Jun 9 17:33 file3 $ mv file1 dir1/ $ mv file2 dir2/ $ mv file3 dir3/ $ ls -l total 0 drwxrwxr-x. 2 localuser localuser 19 Jun 9 17:53 dir1 drwxrwxr-x. 2 localuser localuser 19 Jun 9 17:53 dir2 drwxrwxr-x. 2 localuser localuser 19 Jun 9 17:53 dir3 drwxrwxr-x. 3 localuser localuser 21 Jun 9 16:57 dir4 [mydir]$ ls -lR .: total 0 drwxrwxr-x. 2 localuser localuser 19 Jun 9 17:53 dir1 drwxrwxr-x. 2 localuser localuser 19 Jun 9 17:53 dir2 drwxrwxr-x. 2 localuser localuser 19 Jun 9 17:53 dir3 drwxrwxr-x. 3 localuser localuser 21 Jun 9 16:57 dir4 ./dir1: total 0 -rw-rw-r--. 1 localuser localuser 0 Jun 9 17:31 file1 ./dir2: total 0 -rw-rw-r--. 1 localuser localuser 0 Jun 9 17:33 file2 ./dir3: total 0 -rw-rw-r--. 1 localuser localuser 0 Jun 9 17:33 file3 ./dir4: total 0 drwxrwxr-x. 2 localuser localuser 19 Jun 9 17:35 subdir1 ./dir4/subdir1: total 0 -rw-rw-r--. 1 localuser localuser 0 Jun 9 17:35 file4
[ Boost your Bash skills. Download the Bash shell scripting cheat sheet. ]
And you can use the mv command to move directories into other directories:
$ ls -1 dir1 dir2 dir3 dir4 $ mv dir1/ dir2/ $ mv dir2/ dir3/ $ ls -1 dir3 dir4
The dir1 and dir2 directories still exist; you’ve just moved them. See what it looks like for yourself:
$ ls -R dir3 dir4 ./dir3: dir2 file3 ./dir3/dir2: dir1 file2 ./dir3/dir2/dir1: file1 ./dir4: subdir1 ./dir4/subdir1: file4
Copy files and directories
The cp command copies both files and directories. This command has many options, but the basic syntax is simple. Run cp to copy from one place (source) to another (destination). Consider the following example:
$ ls -1 dir3 dir4 $ cp dir4/subdir1/file4 . $ ls -1 dir3 dir4 file4 $ ls -R dir4/ dir4/: subdir1 dir4/subdir1: file4
To copy an entire directory with its contents, use the -R option, as seen below:
$ cp -R dir3/ dir4/ $ ls -R dir3 dir4 file4 ./dir3: total 0 dir2 file3 ./dir3/dir2: dir1 file2 ./dir3/dir2/dir1: file1 ./dir4: dir3 subdir1 ./dir4/dir3: dir2 file3 ./dir4/dir3/dir2: file2 ./dir4/dir3/dir2/dir1: file1 ./dir4/subdir1: file4
Great Linux resources
When you copy empty directories into other directories, there’s no need for the -R parameter.
More to explore
For each command I’ve demonstrated, there are many more options I’ve left out for the sake of brevity.
As a sysadmin, you must know how to copy, move, and rename files and directories. These file-management commands are the basis of much of what you do on the system and are the building blocks for effective Linux administration. I hope this article aids you in understanding this topic, helps your Linux certification path, and adds to your general sysadmin knowledge.
How to move all files and folders via mv command [duplicate]
Good point. If you are using bash, then you can run shopt -s dotglob and then «*» will match hidden files, too.
What happens if there are folders and files with the same name in the destination folder? Are they overwritten?
. it seems folders with the same name are not overwritten. mv: cannot move ‘/a/js’ to ‘/b/js’: Directory not empty
I know I accepted the first answer many years ago, and it’s stupid for me now to change it. But actually, I’ve been always using this method.
This works for me in Bash (I think this depends on your shell quite a bit. )
$ mv source/* /destination/folder/here
When I try I get mv: overwrite ‘destination/.’? mv: overwrite ‘destination/..’? , but adding -n to mv stops it from trying to overwrite
@Putnik — that’s a good gotcha! what os/distro ? ( I was working on OSX when I was messing around with this. )
This works for me in Bash 4.2.46, it moves all files and folders including hidden files and folders to another directory
Notice that .[^.]* means all hidden files except . and ..
I’d say it’s a bit boring, but really bullet-proof (GNU) way is:
cd /SourceDir && find ./ -maxdepth 1 -mindepth 1 -exec mv -t /Target/Dir <> +
P. S. Now you can possibly see why lots of people do prefer Midnight Commander, though.
If you only want to do a cut and paste-like action there is a simple way that worked for me:
$mv /media/dir_source $HOME/Documents/
It will move the folder named dir_source located in /media to the directory $HOME/Documents/
yet another way just for the heck of it (because I love convoluted ways to do things I guess)
cd /source for f in $(\ls -QA); do eval mv $f /destination/$f; done
the -Q and the -A are not POSIX, however the -A is fairly prevalent, and to not use the -Q you need to change the IFS (which then means you don’t need the eval but need to quote the variable)
IFS=" " && for f in $(ls -A); do mv "$f" /destination/"$f"; done