簡體   English   中英

尋找更簡單的 shell 腳本來重命名具有多種模式的多個文件

[英]Looking for an easier shell script for renaming multiple files with multiple patterns

我有一堆具有這種命名約定的文件:

file01_2018-10-05_123456.pdf
file01_2018-10-06_443352.pdf
file02_2019-09-20_222222.pdf
file02_2019-01-27_246821.pdf
file03_2017-11-22_654321.pdf
file03_2017-04-14_987654.pdf

我有一個腳本,可以找到每個文件編號( file01 - file03 )中的最新版本並將其重命名為T3031T3032T3033 ,在前 6 個字符之后切斷所有內容並附加文件的最后修改日期。 他們最終看起來像這樣(這正是我想要的):

T3031-2018Oct06.pdf
T3032-2019Sep20.pdf
T3033-2017Nov22.pdf

只是腳本對我來說似乎又長又丑( file01 - file17有 17 個循環)。 我希望有人有一個更優雅的解決方案。

這是我所擁有的一部分:

for F in $(ls -t | grep file01 | head -1)
do
    RUNDATE="$(date -r $F +%Y%b%d)"
    a="$(echo $F | head -c6)"
    b="$(echo "$a" | sed 's/file01/T3031/')"
    mv "$F" "${b}-${RUNDATE}.pdf" 2> /dev/null
done

for F in $(ls -t | grep file02 | head -1)
do
    RUNDATE="$(date -r $F +%Y%b%d)"
    a="$(echo $F | head -c6)"
    b="$(echo "$a" | sed 's/file02/T3032/')"
    mv "$F" "${b}-${RUNDATE}.pdf" 2> /dev/null
done

for F in $(ls -t | grep file03 | head -1)
do
    RUNDATE="$(date -r $F +%Y%b%d)"
    a="$(echo $F | head -c6)"
    b="$(echo "$a" | sed 's/file03/T3033/')"
    mv "$F" "${b}-${RUNDATE}.pdf" 2> /dev/null
done

我是腳本編寫新手,這是我的第一個(也是 StackOverflow 的新手)。 提前致謝

這可能對您有用(GNU 排序和重命名):

ls -1 file* |
sort -t_ -k1,1 -k2,2r file1 |
sort -ut_ -k1,1 |
rename -n 'm/^[^_]*(\d\d)_(\d{4})-(\d{2})-(\d{2})_\d+(\..*)/; 
           my $f = 3030+$1;
           my @m = ("XXX","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
           $_ = sprintf "T%d-$2%s$4$5", $f, $m[$3]'

列出所需的file

按文件編號和相反的日期順序對列表進行排序。

刪除除每個文件編號的第一個以外的所有文件。

使用rename來格式化文件名。

注意一旦文件格式符合您的要求,刪除-n rename選項,文件將被重命名。

首先不要解析ls的output

shell 循環:

for file in file*.pdf
do
    mtime=$(date -r "$file" '+%Y%b%d')
    num=${file%%_*}             # remove the first "_" and all following
    num=${num#file}             # remove the "file" prefix
    num=$(( 3030 + 10#$num ))   # force base-10 interpretation of invalid octal "08" and "09"

    mv -v "$file" "T${num}-${mtime}.pdf"
done

或使用rename命令(如果看起來正確,請刪除-n選項)

rename -MPOSIX=strftime -n '
    s{file(\d+).*}{
        sprintf "T%d-%s.pdf", 3030 + $1, strftime("%Y%b%d", localtime((stat)[9]))
    }e
' file*pdf
    !/bin/bash
    for n in 0{1..9} {10..17};
    #iterate thru 17 numbers with 01,02,etc
    do
    for f in *; 
    do 
    filename="$( echo $f | grep file$n )";
    if [[ -z $filename ]]; 
    then echo -ne "No not here..\r";
    #add file to the list of files if found
    else echo $filename >> LOG"$n".txt;sleep .1;fi;
    unset filename;
    done;
    
    #find most recent file in the current LOG and rename it
    
    filename="$( cat LOG"$n".txt | xargs stat -c '%Y %n' | sort | tail -n1 )";
    RUNDATE="$(date -r $F +%Y%b%d)";
    a="$(echo $filename | head -c6)";
    t="$(( n+3030 ))";
    b="$(echo "$a" | sed "s/file$n/T$t/")"
    mv "$filename" "${b}-${RUNDATE}.pdf" 2> /dev/null
    rm -i LOG$n.txt;
    done;
    #Coded by the great-taerg 2199 (c) 2021

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM