Переименование файлов на основе содержимого JSON

замените:

$ sed -i 's/\\parallel[.*]\\parallel/\\norm\{\1\}/g' a.txt $

следующим:

$ sed -i 's/\\parallel\(.*\)\\parallel/\\norm\{\1\}/g' a.txt

Это должно работать

2
28.05.2016, 19:51
1 ответ

Вот довольно простой и понятный сценарий оболочки, который использует jsonpipe , чтобы делать то, что вы хотите. Он не использует никаких причудливых функций sh / bash и выполняет только минимальную проверку корректности имен файлов.

ПРИМЕЧАНИЕ. jq гораздо более эффективен, чем jsonpipe , но jsonpipe проще и удобнее использовать, когда вам не особенно важно (или вы хотите знать) о структуре данных json и вы хотите извлечь только одно или два поля и / или хотите использовать данные json с инструментами строчно-ориентированной обработки текста, такими как awk , sed , grep и т. Д.

Одним из очевидных возможных улучшений является использование printf с заполненным нулями целочисленным полем для переименования файлов в пронумерованные имена с фиксированной шириной, например Untitled-0001.txt вместо Untitled-1.txt . Я оставлю это тебе, если ты этого хочешь.

Как написано, он фактически не переименовывает ни один файл. Будет выведена только команда mv , которую он будет использовать . Измените его, чтобы удалить 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
2
27.01.2020, 22:11

Теги

Похожие вопросы