我有。目录中包含约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
等...
答案 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