Come eliminare i file selezionati dalle regole?

2

Ho una grande lista di file .mp4 in una directory su un NAS (Network Attached Storage).

Alcuni sono elencati come segue:

XXXXX_3800.mp4

e altri simili

XXXXX_8000.mp4

XXXXX è uguale per entrambi i file.

Vorrei automatizzare eliminare XXXXX_8000.mp4 ma SOLO se il file XXXXX_3800.mp4 esiste.

Come devo procedere?

    
posta Laurent06000 03.02.2015 - 23:14

2 risposte

4
  1. Vai a un terminale premendo Ctrl + Alt + T e digita md bin
  2. Vai al trattino
  3. digita gedit e premi Invio
  4. Copia incolla il seguente testo in esso:
    #!/bin/bash

    #
    # This script deletes video files of 8000 bps if and only if the 3800 bps file exists 
    # as set in http://askubuntu.com/questions/581400/how-to-delete-files-selected-by-rules
    #

    # Copyright (c) Fabby 2015

    # This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
    # This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. See the GNU General Public License for more details.
    # You DID NOT receive a copy of the GNU General Public License along with this program as the license is bigger than this program.
    # Therefore, see http://www.gnu.org/licenses/ for more details.

    for szFile in $(ls *3800.mp4)
    do
      if [ -f ${szFile:0:${#szFile}-8}'8000.mp4' ] ; then
        echo "deleting ${szFile:0:${#szFile}-8}8000.mp4..."
        rm -f ${szFile:0:${#szFile}-8}'8000.mp4'
      fi
    done
  1. Salva il file in ~/bin/del8000
  2. Torna al terminale e digita: chmod +x ~/bin/del8000
  3. Nel tipo di terminale: cd ~/Videos
  4. Digita del8000

Fatto!

    
risposta data Fabby 04.02.2015 - 00:10
1

In una singola directory (piatta)

Se tutti i file si trovano nella stessa directory, lo script riportato di seguito dovrebbe eseguire il lavoro.

#!/usr/bin/env python3
import os
import sys

dr = sys.argv[1]; ids = ("_3800.mp4", "_8000.mp4")
checklist = [f[:-9] for f in os.listdir(dr) if f[-9:] in (ids)]
for f in [f for f in set(checklist) if checklist.count(f) != 1]:
    os.remove(dr+"/"+f+"_8000.mp4")

Come funziona:

  • Lo script elenca tutti i file, terminando con _3800.mp4 o _8000.mp4 , rimossi dalle loro terminazioni
  • Se il nome (stripped-) si verifica due volte, esistono entrambe le versioni (poiché i nomi duplicati sono impossibili in una stessa directory)
  • Successivamente, lo script rimuove la _8000.mp4 - versione dai duplicati

In una directory a più livelli (ricerca ricorsiva)

Un approccio leggermente diverso. Confronta i file in modo ricorsivo e (solo) elimina _8000.mp4 - versione se esiste _3800.mp4 - versione.
Non ero sicuro che ci fosse bisogno di una ricerca ricorsiva , ma l'ho comunque aggiunta.

Come funziona:

  • Prima elenca i file da conservare comunque
  • Quindi rimuovi possibili "buttare via", se esiste la versione da conservare.
#!/usr/bin/env python3
import os
import sys

files_dir = sys.argv[1]; file_list = []
#---
keep = "_3800.mp4"; rm = "_8000.mp4"
#---
for root, dirs, files in os.walk(files_dir):
    for name in files:
        if name.endswith(keep):
            file_list.append(name)
    for name in files:
        if name.endswith(rm) and name.replace(rm, keep) in file_list:
            os.remove(root+"/"+name)


Come usare

Per utilizzare uno di questi script:

  1. Copia lo script in un file vuoto, salvalo come clean_directory.py
  2. Eseguilo, con la directory da ripulire come argomento, con il comando:

    python3 /path/to/clean_directory.py </path/to/directory/to/clean>
    
risposta data Jacob Vlijm 09.02.2015 - 16:00

Leggi altre domande sui tag