Remove all files except some from a directory

前端 未结 19 1127
生来不讨喜
生来不讨喜 2020-11-30 16:36

When using sudo rm -r, how can I delete all files, with the exception of the following:

textfile.txt
backup.tar.gz
script.php
database.sql
info.         


        
相关标签:
19条回答
  • 2020-11-30 16:57

    Just:

    rm $(ls -I "*.txt" ) #Deletes file type except *.txt
    

    Or:

    rm $(ls -I "*.txt" -I "*.pdf" ) #Deletes file types except *.txt & *.pdf
    
    0 讨论(0)
  • 2020-11-30 16:59

    You can write a for loop for this... %)

    for x in *
    do
            if [ "$x" != "exclude_criteria" ]
            then
                    rm -f $x;
            fi
    done;
    
    0 讨论(0)
  • 2020-11-30 17:00

    You can do this with two command sequences. First define an array with the name of the files you do not want to exclude:

    files=( backup.tar.gz script.php database.sql info.txt )
    

    After that, loop through all files in the directory you want to exclude, checking if the filename is in the array you don't want to exclude; if its not then delete the file.

    for file in *; do
      if [[ ! " ${files[@]} " ~= "$file"  ]];then
        rm "$file"
      fi
    done
    
    0 讨论(0)
  • 2020-11-30 17:02

    Since no one yet mentioned this, in one particular case:

    OLD_FILES=`echo *`
    ... create new files ...
    rm -r $OLD_FILES
    

    (or just rm $OLD_FILES)

    or

    OLD_FILES=`ls *`
    ... create new files ...
    rm -r $OLD_FILES
    

    You may need to use shopt -s nullglob if some files may be either there or not there:

    SET_OLD_NULLGLOB=`shopt -p nullglob`
    shopt -s nullglob
    FILES=`echo *.sh *.bash`
    $SET_OLD_NULLGLOB
    

    without nullglob, echo *.sh *.bash may give you "a.sh b.sh *.bash".

    (Having said all that, I myself prefer this answer, even though it does not work in OSX)

    0 讨论(0)
  • find . | grep -v "excluded files criteria" | xargs rm

    This will list all files in current directory, then list all those that don't match your criteria (beware of it matching directory names) and then remove them.

    Update: based on your edit, if you really want to delete everything from current directory except files you listed, this can be used:

    mkdir /tmp_backup && mv textfile.txt backup.tar.gz script.php database.sql info.txt /tmp_backup/ && rm -r && mv /tmp_backup/* . && rmdir /tmp_backup
    

    It will create a backup directory /tmp_backup (you've got root privileges, right?), move files you listed to that directory, delete recursively everything in current directory (you know that you're in the right directory, do you?), move back to current directory everything from /tmp_backup and finally, delete /tmp_backup.

    I choose the backup directory to be in root, because if you're trying to delete everything recursively from root, your system will have big problems.

    Surely there are more elegant ways to do this, but this one is pretty straightforward.

    0 讨论(0)
  • 2020-11-30 17:06

    Assuming that files with those names exist in multiple places in the directory tree and you want to preserve all of them:

    find . -type f ! -regex ".*/\(textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt\)" -delete
    
    0 讨论(0)
提交回复
热议问题