Unix: How to delete files listed in a file

后端 未结 13 1555
遥遥无期
遥遥无期 2020-12-04 06:31

I have a long text file with list of file masks I want to delete

Example:

/tmp/aaa.jpg
/var/www1/*
/var/www/qwerty.php

I need delet

相关标签:
13条回答
  • 2020-12-04 07:08

    xargs -I{} sh -c 'rm {}' < 1.txt should do what you want. Be careful with this command as one incorrect entry in that file could cause a lot of trouble.

    This answer was edited after @tdavies pointed out that the original did not do shell expansion.

    0 讨论(0)
  • 2020-12-04 07:12

    Here's another looping example. This one also contains an 'if-statement' as an example of checking to see if the entry is a 'file' (or a 'directory' for example):

    for f in $(cat 1.txt); do if [ -f $f ]; then rm $f; fi; done
    
    0 讨论(0)
  • 2020-12-04 07:15

    You can use this one-liner:

    cat 1.txt | xargs echo rm | sh
    

    Which does shell expansion but executes rm the minimum number of times.

    0 讨论(0)
  • 2020-12-04 07:16

    This will allow file names to have spaces (reproducible example).

    # Select files of interest, here, only text files for ex.
    find -type f -exec file {} \; > findresult.txt
    grep ": ASCII text$" findresult.txt > textfiles.txt
    # leave only the path to the file removing suffix and prefix
    sed -i -e 's/:.*$//' textfiles.txt
    sed -i -e 's/\.\///' textfiles.txt
    
    #write a script that deletes the files in textfiles.txt
    IFS_backup=$IFS
    IFS=$(echo "\n\b")
    for f in $(cat textfiles.txt); 
    do 
    rm "$f"; 
    done
    IFS=$IFS_backup
    
    # save script as "some.sh" and run: sh some.sh
    
    0 讨论(0)
  • 2020-12-04 07:17

    Use this:

    while IFS= read -r file ; do rm -- "$file" ; done < delete.list
    

    If you need glob expansion you can omit quoting $file:

    IFS=""
    while read -r file ; do rm -- $file ; done < delete.list
    

    But be warned that file names can contain "problematic" content and I would use the unquoted version. Imagine this pattern in the file

    *
    */*
    */*/*
    

    This would delete quite a lot from the current directory! I would encourage you to prepare the delete list in a way that glob patterns aren't required anymore, and then use quoting like in my first example.

    0 讨论(0)
  • 2020-12-04 07:19

    You could use '\n' for define the new line character as delimiter.

    xargs -d '\n' rm < 1.txt
    

    Be careful with the -rf because it can delete what you don't want to if the 1.txt contains paths with spaces. That's why the new line delimiter a bit safer.

    On BSD systems, you could use -0 option to use new line characters as delimiter like this:

    xargs -0 rm < 1.txt
    
    0 讨论(0)
提交回复
热议问题