开发者

shell script to remove selected directories

i have bunch of d开发者_运维问答irs , say **a, b, c0, d, Z , foo, ** and so on.

I want to remove all the directories except dirs foo, foo2, a and b

can anyone provide me the syntax to do this shell?

Thanks

UPDATE I just want to say Thank you to all of you for your responses!


echo `ls -1 -d */ | egrep -v '^(foo|foo2|a|b)/$'`

If you are satisfied with the output, replace echo with rmdir (or rm -r, if the directories still contain data).


Probably the easiest way;

mkdir ../tempdir
mv foo foo2 a b ../tempdir
rm *
mv ../tempdir/* .
rmdir ../tempdir

Please note that this deletes also all files, not just directories.


You can use find on a complicated command line, but perhaps the simplest and, more importantly, safest way is to create a file that lists all of the directories you want to remove. Then use the file as input to rm like this:

find . -maxdepth 1 -type d > dirs_to_remove

Now edit the file and take out any directories you want to keep, then use rm:

rm -ir $(<edited_dirs_to_remove)

Note the -i argument. It's optional and forces rm to ask you before deleting each file. Also note the $(<filename) syntax, which is specific to bash and is equivalent to, but cheaper than $(cat filename).


One of the more powerful ways to do this sort of trick is using find + grep + xargs:

DONT_REMOVE='a|b|c0|d|Z|foo'
find . -type d -print | egrep -v "^\.$DONT_REMOVE\$" | xargs rm -r

The only trick here is making sure the pattern matches only those you don't want to remove. The above pattern only matches files in the current directory. You can make it more or less permissive, e.g:

IF_PATH_IS_IMMEDIATE_SUBDIR="^\./($DONT_REMOVE)$"
IF_PATH_ENDS_IN="/($DONT_REMOVE)$"
IF_PATH_CONTAINS="/($DONT_REMOVE)(/.*)?$"

Then pass one of these in your egrep, e.g:

find . -type d -print | egrep -v "$IF_PATH_ENDS_IN" | xargs rm -r

To invert the choice (ie. delete all those items) just remove the -v from the egrep


one way

find . -maxdepth 1 -type d \( ! -name "bar" -a ! -name "foo" -a ! -name "a" -a ! -name "b" \) -delete  # to remove files as well, remove -type d

OR try using extglob

shopt -s extglob
rm -rf !(foo|bar|a|b)/  # to delete files as well, remove the last "/"

And yes, this assume you don't want the rest of the directories in your directory except the 4 directories you want.

0

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜