zapętlić wewnątrz ścieżek wielopoziomowych i zmienić nazwę

0

Zakładając, że mam plik o nazwie list.txt zawiera ścieżki do plików w katalogu;

I wzór ścieżek w ten sposób:

./path/to/file.txt
./path/to/another/file.txt
... etc

Chcę zapętlić się w środku list.txt plik, aby pobrać ścieżki plików i zmienić ich kodowanie za pomocą iconv;

Robiłem to, jeśli wszystko było w tym samym katalogu, używając:

for i in `cat list.txt` ; do iconv -f windows-1256 -t utf8 $i > new_$i; done

Ale problem Teraz stoję przed, ponieważ są to ścieżki na poziomie muli, nazywające wyjście iconv drukuje new_$i na początku ścieżka - jak sądzę - i to daje mi błędy:

No such file or directory

Więc jak mogę uzyskać wyjście iconv być jak:

./path/to/new_file.txt
./path/to/another/new_file.txt
... etc
Homer
źródło
I módl się, co to jest kąpiel , w komputerze mówisz?
MariusMatutiae
przepraszam, miałem na myśli „Ścieżki”, to była literówka!
Homer

Odpowiedzi:

1

Możesz użyć czegoś takiego, jeśli używasz bash jako twoja skorupa:

while read name
do dir="${name%/*}" file="${name##*/}"
iconv -f windows-1256 -t utf8 "$dir/$file" -o "$dir/new_$file"
done  < list.txt

Linia, która przypisuje dir i file używa konstrukcji udokumentowanych w Parameter expansion część EXPANSION sekcja bash strona man. Znaki cudzysłowu wokół konstrukcji służą do obsługi białych znaków w nazwach plików.

Jeśli chcesz przetestować coś takiego przed jego użyciem, możesz dodać go wcześniej echo do polecenia zainteresowania ( iconv w tym przykładzie), aby upewnić się, że polecenie jest tym, czym ma być.

Eirik Fuller
źródło