Awk

根據 JSON 內容重命名文件

  • July 10, 2021

我有兩組文件:

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

引用自:https://unix.stackexchange.com/questions/283690