Я собираюсь идти вперед и дать мое смещенное мнение. Я первоначально начал свою поездку Unix с OpenBSD. После того, как я действительно вошел в материал .NET на работе, я начал бездельничать с Моно. Порт OpenBSD моно довольно стар и обычно просто не работает хорошо. Так, я намеревался находить что-то лучше. То, что я нашел, было Дугой Linux
Я думаю, что существует несколько вещей о Дуге Linux, которые делают его особенно приспособленным для программирования:
bash4: Сначала считайте отображения в массив
declare -A arr2
while IFS=, read -r -a arr; do
arr2[${arr[0]}]="${arr[1]}";
done < mapfile.txt
И затем переименуйте
for f in [0-9][0-9][0-9].jpg; do
if [[ "${arr2[${f%.*}]+_}" ]]
then
mv -- "${f}" "${f%.*}"-"${arr2[${f%.*}]}"."${f##*.}";
else
mv -- "${f}" "${f%.*}"-default."${f##*.}";
fi
done
Можно просто выполниться
join -t. -j1 <(tr , . < map) filelist | sed 's/\./-/' | paste filelist - | xargs -L1 mv
где map
контекстная карта и filelist
список файлов. Соединение разделит на .
и использует первое поле в качестве значения соединения; должны быть отсортированы оба списка. paste
затем склеит каждую строку filelist
с недавно сгенерированным именем файла вместе в одной строке, в то время как xargs
затем вызовы mv
на каждой из тех строк.
Вот:
for file in [0-9][0-9][0-9].jpg;do
name="${file%%.*}" # Remove extension
map="$(grep "$name" map_file | cut -d',' -f 2)"
echo mv "$file" "$name-$map".jpg
done
Это предполагает, что "карта" находится в файле map_file
. В последних версиях Bash можно также преобразовать этот файл в ассоциативный массив и использование это для удобства (вместо того, чтобы пройти map_file
для каждого нового файла Вы хотите переименовать).
Между прочим, это будет только echo
mv
команды. Удалите echo
когда Вы чувствуете, что все в порядке, чтобы на самом деле сделать переименование.
< map sed 's/\([^,]*\),\(.*\)/mv -- "\1.jpg" "\1-\2.jpg"/' | sh -x
(который предполагает, что файл карты не содержит "
, $
, обратная косая черта или символы обратной галочки.
zsh
но не вbash
илиksh93
где числа с продвижением 0 рассматривают как восьмеричные. – Stéphane Chazelas 09.11.2013, 22:15GNU bash, version 4.2.25
перед регистрацией это работает. Я предполагаю, что это вызвано тем, чтоarr2
считается ассоциативным массивом по умолчанию под ударом 4, таким образом, индекс не считают "арифметическим контекстом"? – iruvar 10.11.2013, 18:15042-.jpg
. Можно хотеть добавить тест для этого. – Gilles 'SO- stop being evil' 10.11.2013, 21:41008
в mapfile? – Stéphane Chazelas 10.11.2013, 22:14arr2
ассоциативный массив. Метки этого bash4 решение – iruvar 10.11.2013, 22:56