如何使用bash清理多个文件名?

时间:2019-04-16 05:15:38

标签: string bash date filenames

我有。目录中包含约250个.txt文件。这些文件中的每个文件都有这样的标题:

Abraham Lincoln [December 01, 1862].txt

George Washington [October 25, 1790].txt

等...

但是,这些是读入python的可怕文件名,我想遍历所有文件以将其更改为更合适的格式。

我已经尝试过类似的操作来更改在多个文件之间共享的单个变量。但是我无法确定如何遍历这些文件并更改其名称格式,同时又保持相同的信息。

理想的输出应该是

1861_12_01_abraham_lincoln.txt

1790_10_25_george_washington.txt

等...

3 个答案:

答案 0 :(得分:1)

请尝试简单(乏味)的bash脚本:

#!/bin/bash

declare -A map=(["January"]="01" ["February"]="02" ["March"]="03" ["April"]="04" ["May"]="05" ["June"]="06" ["July"]="07" ["August"]="08" ["September"]="09" ["October"]="10" ["November"]="11" ["December"]="12")

pat='^([^[]+) \[([A-Za-z]+) ([0-9]+), ([0-9]+)]\.txt$'
for i in *.txt; do
    if [[ $i =~ $pat ]]; then
        newname="$(printf "%s_%s_%s_%s.txt" "${BASH_REMATCH[4]}" "${map["${BASH_REMATCH[2]}"]}"  "${BASH_REMATCH[3]}" "$(tr 'A-Z ' 'a-z_' <<< "${BASH_REMATCH[1]}")")"
        mv -- "$i" "$newname"
    fi
done

答案 1 :(得分:0)

我喜欢将文件名拆开,然后再放回去。

GNU日期还可以解析时间,这比使用sed或大的case语句将“十月”转换为“ 10”要简单得多。

#! /usr/bin/bash

if [ "$1" == "" ] || [ "$1" == "--help" ]; then
    echo "Give a filename like \"Abraham Lincoln [December 01, 1862].txt\" as an argument"
    exit 2
fi

filename="$1"

# remove the brackets
filename=`echo "$filename" | sed -e 's/[\[]//g;s/\]//g'`

# cut out the name
namepart=`echo "$filename" | awk '{ print $1" "$2 }'`

# cut out the date
datepart=`echo "$filename" | awk '{ print $3" "$4" "$5 }' | sed -e 's/\.txt//'`

# format up the date (relies on GNU date)
datepart=`date --date="$datepart" +"%Y_%m_%d"`

# put it back together with underscores, in lower case
final=`echo "$namepart $datepart.txt" | tr '[A-Z]' '[a-z]' | sed -e 's/ /_/g'`

echo mv \"$1\" \"$final\"

编辑:从Bourne shell转换为BASH。

答案 2 :(得分:0)

Android/sdk/ndk-bundle 
➜ cat source.properties 
Pkg.Desc = Android NDK
Pkg.Revision = 19.2.5345600