Bulk renaming of files based on lookup

前端 未结 9 465
忘掉有多难
忘掉有多难 2020-12-11 05:55

I have a folder full of image files such as

  • 1500000704_full.jpg
  • 1500000705_full.jpg
  • 1500000711_full.jpg
  • 1500000712_full.jpg
相关标签:
9条回答
  • 2020-12-11 06:46

    This is very straightforward to do in Bash assuming that there's an entry in the lookup file for each file and each file has a lookup entry.

    #!/bin/bash
    while read -r to from
    do
        if [ -e "${from}_full.jpg" ]
        then
            mv "${from}_full.jpg" "${to}_full.jpg"
        fi
    done < lookupfile.txt
    

    If the lookup file has many more entries than there are files then this approach may be inefficient. If the reverse is true then an approach that iterates over the files may be inefficient. However, if the numbers are close then this may be the best approach since it doesn't have to actually do any lookups.

    If you'd prefer a lookup version that's pure-Bash:

    #!/bin/bash
    while read -r to from
    do
        lookup[from]=$to
    done < lookupfile.txt
    
    for file in *.jpg
    do
        base=${file%*_full.jpg}
        mv "$file" "${lookup[base]}_full.jpg"
    done
    
    0 讨论(0)
  • 2020-12-11 06:48

    A rewrite of Wesley's using generators:

    import os, os.path
    
    with open('mapping.txt') as mapping_file:
        mapping = dict(line.strip().split() for line in mapping_file)
    
    rootextiter = ((filename, os.path.splitext(filename)) for filename in os.listdir('.'))
    mappediter = (
        (filename, os.path.join(mapping[root], extension))
        for filename, root, extension in rootextiter
        if root in mapping
    )
    for oldname, newname in mappediter:
        os.rename(oldname, newname)
    
    0 讨论(0)
  • 2020-12-11 06:50

    I modified Wesley's Code to work for my specific situation. I had a mapping file "sort.txt" that consisted of different .pdf files and numbers to indicate the order that I want them in based on an output from DOM manipulation from a website. I wanted to combine all these separate pdf files into a single pdf file but I wanted to retain the same order they are in as they are on the website. So I wanted to append numbers according to their tree location in a navigation menu.

    1054 spellchecking.pdf
    1055 using-macros-in-the-editor.pdf
    1056 binding-macros-with-keyboard-shortcuts.pdf
    1057 editing-macros.pdf
    1058 etc........
    

    Here is the Code I came up with:

    import os, sys
    
    # A dict with keys being the old filenames and values being the new filenames
    mapping = {}
    
    # Read through the mapping file line-by-line and populate 'mapping'
    with open('sort.txt') as mapping_file:
        for line in mapping_file:
    
            # Split the line along whitespace
            # Note: this fails if your filenames have whitespace
            new_name, old_name = line.split()
            mapping[old_name] = new_name
    
    
    # List the files in the current directory
    for filename in os.listdir('.'):
        root, extension = os.path.splitext(filename)
    
        #rename, put number first to allow for sorting by name and 
        #then append original filename +e extension
        if filename in mapping:
            print "yay" #to make coding fun
            os.rename(filename, mapping[filename] + filename + extension)
    

    I didn't have a suffix like _full so I didn't need that code. Other than that its the same code, I've never really touched python so this was a good learning experience for me.

    0 讨论(0)
提交回复
热议问题