开发者

How to use 'mv' command to move files except those in a specific directory?

开发者 https://www.devze.com 2023-02-02 23:57 出处:网络
I am wondering - how can I move all the files in a directory except tho开发者_开发百科se files in a specific directory (as \'mv\' does not have a \'--exclude\' option)?Lets\'s assume the dir structure

I am wondering - how can I move all the files in a directory except tho开发者_开发百科se files in a specific directory (as 'mv' does not have a '--exclude' option)?


Lets's assume the dir structure is like,

|parent
    |--child1
    |--child2
    |--grandChild1
    |--grandChild2
    |--grandChild3
    |--grandChild4
    |--grandChild5
    |--grandChild6

And we need to move files so that it would appear like,

|parent
    |--child1
    |   |--grandChild1
    |   |--grandChild2
    |   |--grandChild3
    |   |--grandChild4
    |   |--grandChild5
    |   |--grandChild6
    |--child2

In this case, you need to exclude two directories child1 and child2, and move rest of the directories in to child1 directory.

use,

mv !(child1|child2) child1

This will move all of rest of the directories into child1 directory.


Since find does have an exclude option, use find + xargs + mv:

find /source/directory -name ignore-directory-name -prune -print0 | xargs -0 mv --target-directory=/target/directory

Note that this is almost copied from the find man page (I think using mv --target-directory is better than cpio).


First get the names of files and folders and exclude whichever you want:

ls --ignore=file1 --ignore==folder1 --ignore==regular-expression1 ...

Then pass filtered names to mv as the first parameter and the second parameter will be the destination:

mv $(ls --ignore=file1 --ignore==folder1 --ignore==regular-expression1 ...) destination/


This isn't exactly what you asked for, but it might do the job:

mv the-folder-you-want-to-exclude somewhere-outside-of-the-main-tree
mv the-tree where-you-want-it
mv the-excluded-folder original-location

(Essentially, move the excluded folder out of the larger tree to be moved.)

So, if I have a/ and I want to exclude a/b/c/*:

mv a/b/c ../c
mv a final_destination
mkdir -p a/b
mv ../c a/b/c

Or something like that. Otherwise, you might be able to get find to help you.


This will move all files at or below the current directory not in the ./exclude/ directory to /wherever...

find -E . -not -type d -and -not -regex '\./exclude/.*' -exec echo mv {} /wherever \;


ls | grep -v exclude-dir | xargs -t -I '{}' mv {} exclude-dir


#!/bin/bash

touch apple  banana  carrot  dog  cherry

mkdir fruit

F="apple  banana  carrot  dog cherry"

mv ${F/dog/} fruit

# this removes 'dog' from the list F, so it remains in the current directory and not moved to 'fruit'


rename your directory to make it hidden so the wildcard does not see it:

mv specific_dir .specific_dir 
mv * ../other_dir


Inspired by @user13747357 's answer.

First you can ls the file and filter them by:

ls | egrep -v '(dir_name|file_name.ext)'

Then you can run the following command to move the files except the specific ones:

mv $(ls | egrep -v '(dir_name|file_name.ext)') target_dir

* Note that I tested this inside a specific directory. Cross-directory operation should be more carefully executed :)


suppose you directory is

.
├── dir1
│    └── a.txt
├── dir2
│    ├── b.txt
│    └── hello.c
├── file1.txt
├── file2.txt
└── file3.txt

and you gonna put file1 file2 file3 into dir2.

you can use mv $(ls -p | grep -v /) /dir2 to finish it, because

ls -p | grep -v / will print all files except directory in cwd.


For example, if I want to move all files/directories - except a specified file or directory - inside "var/www/html" to a sub-folder named "my_sub_domain", then I use "mv" with the command "!(what_to_exclude)":

$ cd /var/www/html $ mv !(my_sub_domain) my_sub_domain

To exclude more I use "|" to seperate file/directory names:

$ mv !(my_sub_domain|test1.html) my_sub_domain


mv * exclude-dir

was the perfect solution for me

0

精彩评论

暂无评论...
验证码 换一张
取 消