Распаковать файлы в BASH - PullRequest
       36

Распаковать файлы в BASH

1 голос
/ 07 октября 2009

У меня есть набор, около 8000 или около того, файлов, которые мне нужно восстановить. Файлы представляют собой списки чисел, разделенных возвратами:

nnnn
nnnnn
nnnn

и я хотел бы отсортировать и деупешировать числа в самих файлах. Я могу сделать это вручную, используя сортировку | uniq или sort -u, но я хочу перезаписать файлы. Есть ли способ сделать это без использования временного файла? И какой синтаксис я должен использовать, чтобы избежать ошибки «неоднозначного перенаправления»! : -)

#!/usr/bin/env bash
cd /Users/dd/Desktop/images
TEMP="/tmp/$(basename $0).$RANDOM.txt"
for FILENAME in "`find . -name *version_ids.txt -print`"
do
  cat $FILENAME | sort -u > $TEMP
  $TEMP > $FILENAME
done

(Я попробовал следующее, что не дало ошибки, но, похоже, не дало желаемого эффекта ...

#!/usr/bin/env bash
cd /Users/dd/Desktop/images
for FILENAME in "`find . -name *version_ids.txt -print`"
do
  sort -u $FILENAME -o $FILENAME
done

)

Ответы [ 4 ]

3 голосов
/ 07 октября 2009

GNU sort может редактировать файл на месте:

sort -u -o $FILENAME $FILENAME
1 голос
/ 26 июля 2011

Схожая проблема, с которой я часто сталкиваюсь, заключается в дедупликации, но без сортировки (сохранить первый удар):

perl -ne '$seen{$_}++ or print' in > out

Или на месте:

perl -i -ne '$seen{$_}++ or print' inout

Это могут некоторые посетители, так как тема не говорит сортировка.

1 голос
/ 07 октября 2009

Попробуйте

#!/usr/bin/env bash
cd /Users/dd/Desktop/images
for FILENAME in $(find . -name *version_ids.txt -print)
do
  sort -u "$FILENAME" > "$FILENAME.tmp"
  mv "$FILENAME" "$FILENAME.bak" && mv "$FILENAME.tmp" "$FILENAME"
done

Обратите внимание, что этот скрипт все еще не защищен от проблемных имен файлов (с пробелами или символами новой строки в них).

0 голосов
/ 07 октября 2009

Вы не можете сделать $TEMP > $FILENAME

#!/usr/bin/env bash
cd /Users/dd/Desktop/images
TEMP="/tmp/$(basename $0).$RANDOM.txt"
for FILENAME in $(find . -name *version_ids.txt -print)
do
  <"$FILENAME" sort -u >"$TEMP"
  cat "$TEMP" >"$FILENAME"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...