How to move all files in current folder to subfolder?

I am at the path:

/myuser/downloads/

And I create a sub folder:

/myuser/downloads/new

Now I want to move all files and folders/sub-folders in the downloads folder to the sub-folder.

how can I do this?

I tried:

mv -R *.* new/

But move doesn't take the -R switch it seems.

1

6 Answers

The command

mv !(new) new

should do the trick. If it doesn't work, run shopt -s extglob first.

To also move hidden files/directories (that beginning with a dot), run also shopt -s dotglob first.
So, to sum up:

shopt -s extglob dotglob
mv !(new) new
shopt -u dotglob

(it is always better to unset dotglob to avoid bad surprises).

7

I found something like this but is a bit simpler to understand, and it might work well for you too:

ls | grep -v new | xargs mv -t new

Adding an explanation to the above solution:

From man pages:

  • mv -t

    -t, --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY
  • grep -v

    -v, --invert-match Invert the sense of matching, to select non-matching lines.

Explained by step:

  • ls will list the files in current directory
  • grep -v new will return piped to that is not match new
  • xargs mv -t new will move the files piped to it from grep -v to the target directory
9

Just use mv * subdir1 and ignore the warning.

You can just use mv * subdir1. You will see a warning message relating to trying to move subdir1 into itself, like this:

mv: cannot move 'subdir1' to a subdirectory of itself, 'subdir1/subdir1'

But it will move all of the other files and directories to subdir1 correctly.

An example:

$ ls
$ mkdir dir1 dir2 dir3
$ touch file1.txt file2.txt file3.txt
$ mkdir subdir1
$ ls
#=> dir1 dir2 dir3 file1.txt file2.txt file3.txt subdir1
$ mv * subdir1
#=> mv: cannot move 'subdir1' to a subdirectory of itself, 'subdir1/subdir1'
$ ls
#=> subdir1
$ ls subdir1
#=> dir1 dir2 dir3 file1.txt file2.txt file3.txt
3

Simple idea. Assuming you are in /myuser, rename downloads to new, create a new downloads directory then move new into it.

mv downloads new # downloads is now called new
mkdir downloads # create new directory downloads
mv new downloads # move new into it.
1

If you want to move all the files from a folder to one of its subfolders you can use the following command:

find /myuser/downloads/ -type d -name 'new' -prune -type f | xargs mv -t /myuser/downloads/new

It will find all the files and then move them to your subfolder.

@waltinator: added -type d -name 'new' -prune to prevent traversal of /myuser/downloads/new.

1

You can try this alternative process –– remain in the path

/myuser/downloads/

but, instead of first creating the /myuser/downloads/new/ directory, instead create a folder in the /myuser/ directory, with the command mkdir ../new, then move all the files in downloads to new, and finally move new into downloads. You can do this in one line, while in the /myuser/downloads/ path, with the command:

mkdir ../new && mv * ../new && mv ../new ../downloads

In this case, you don't have to worry about any sort of "filtering" of files/folders, since new is on the same level of the path as downloads, so you can just move everything in downloads to new, and then move new into downloads`.

However, if you already have the subfolder new created and don't want to create another one, not to worry –– just change the mkdir command on the left-hand side of the first && in the command shown above to an mv command, pushing new up in the path; in other words, while you're still in /myuser/downloads/, you can change mkdir ../new to mv new ... Then the subfolder new [in the path /myuser/downloads/new/] gets pushed up to /myuser/new/, at the same level as /myuser/downloads/, and then you can run the rest of the command as it is shown above. All together, we have, starting from the path /myuser/downloads/:

mv new .. && mv * ../new && mv ../new ../downloads

and, since you wanted to "move all files and folders/sub-folders in the downloads folder to the sub-folder [new]", you're done! If you had wanted to move only files (or only folders or [insert more granular object movement]), then you'd have to use other commands that can "filter" objects, such as grep. The commands written above are sufficient for your purposes, though.

1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like