Awk
根據 JSON 內容重命名文件
我有兩組文件:
file1.txt file1.json file2.txt file2.json file3.txt file3.json ... fileN.txt fileN.json
JSON 文件包含以下格式:
{ "ago": "59 sec ago", "base_time": 1401243133, "title": "Untitled", "type": "None", "retrieval_time": 1401624105, "id": "qwNAgvYZ" }
我想用相應文件
fileX.txt
中的參數值重命名每個。title``fileX.json
例如,
rename fileX.txt -> Untitled
我可以按如下方式過濾掉該值;
cat fileX.json | awk -F"\"" '{print $10}'
但是如果我遇到一個現有的文件名,它應該用後綴重命名。
例如,假設有一個現有的
Untitled.txt
. 所以新文件應該重命名為Untitled-1.txt
. 下次相遇Untitled-2.txt
同樣如此。
這是一個相當簡單直接的 shell 腳本,它使用jsonpipe來做你想做的事。它不使用任何花哨的 sh/bash 功能,並且只對文件名進行最低限度的完整性檢查。
注意:jq比 更強大
jsonpipe
,但是jsonpipe
當您不特別關心(或想知道)json數據的結構並且只想提取一兩個欄位和/或想要將 json 數據與 , 等面向行的文本處理工具awk
一起sed
使用grep
。一種明顯的可能增強功能是使用
printf
零填充整數欄位將文件重命名為固定寬度編號的名稱,例如,Untitled-0001.txt
而不是Untitled-1.txt
. 如果你願意,我會把它留給你去做。正如所寫,它實際上不會重命名任何文件。它只會列印它將
mv
使用的命令。編輯它以刪除每個命令之前的 from 以使其實際重命名文件。echo``mv
#! /bin/sh for f in file*.txt ; do b=$(basename "$f" .txt) # ignore current .txt file if there's no matching .json file if [ -e "$b.json" ] ; then # extract the title field. title=$(jsonpipe < "$b.json" | awk -F'\t' '$1=="/title" {gsub(/\"/,"",$2) ; print $2}') if [ -n "$title" ] ; then if [ ! -e "$title.txt" ] ; then echo mv -v "$f" "$title.txt" else # are there any other "$title-*.txt" filenames? others=$(find . -maxdepth 1 -name "$title-*.txt") if [ -z "$others" ] ; then echo mv -v "$f" "$title-1.txt" else # use version-sort to get highest $title- number used. highest=$(printf "%s\n" "$others" | sort -V | tail -n 1) hnum=$(printf "%s\n" "$highest" | sed -e 's/^.*-// ; s/\.txt$//') hnum=$(( highest_num + 1)) echo mv -v "$f" "$title-$hnum.txt" fi fi fi fi done
使用範例/證明它有效:
$ ls -l total 8 -rw-rw-r-- 1 cas cas 132 May 19 23:47 file1.json -rw-rw-r-- 1 cas cas 0 May 20 00:04 file1.txt -rwxrwxr-x 1 cas cas 797 May 20 00:04 json-rename.sh $ cat file1.json {"ago": "59 sec ago", "base_time": 1401243133, "title": "Untitled", "type": "None", "retrieval_time": 1401624105, "id": "qwNAgvYZ"} $ ./json-rename.sh mv -v file1.txt Untitled.txt $ touch Untitled.txt $ ./json-rename.sh mv -v file1.txt Untitled-1.txt $ touch Untitled-1.txt $ ./json-rename.sh mv -v file1.txt Untitled-2.txt $ touch Untitled-999.txt $ ./json-rename.sh mv -v file1.txt Untitled-1000.txt