скрипт для обмена двумя файлами

одна вещь, которая всегда сводила меня с ума, - это необходимость делать

 mv file1 tmp
 mv file2 file1
 mv tmp file2

в oder для замены двух имен файлов.

, что вы, ребята, используете для обмена двумя файлами? Есть ли стандартный скрипт для обмена? что-то вроде sw file1 file2 было бы неплохо

6
задан 21 October 2011 в 06:42

4 ответа

Предложение заключается в том, чтобы добавить к bash функцию, которая будет заменять два файла:

nano .bashrc

вставить в нижней части файла:

function swap()         
{
  if [ $# -ne 2 ]; then
    echo "Usage: swap file1 file2"
  else
    local TMPFILE=$(mktemp)
    mv "$1" $TMPFILE
    mv "$2" "$1"
    mv $TMPFILE "$2"
  fi
}

либо logout / login или run:

source .bashrc

Для замены двух файлов:

swap x y

где x и y - ваши имена файлов

source [ ! d5]

11
ответ дан 25 May 2018 в 17:49
  • 1
    Я бы поставил && между этими тремя командами mv, иначе существует риск уничтожения одного из файлов, если у вас заканчивается свободное пространство. С другой стороны, я бы сделал TMPFILE в tmpfile; это не переменная среды. – geirha 9 April 2012 в 02:31
  • 2
    Как мне отменить действие? – AGamePlayer 11 February 2014 в 21:59
  • 3
    @AwQiruiGuo - просто сделайте обратное - отредактируйте .bashrc и удалите функцию, затем повторно запустите источник или выйдите из системы / войдите в систему. – fossfreedom♦ 11 February 2014 в 22:04
  • 4
    @fossfreedom Спасибо. На самом деле я заметил, что если я перезапущу терминал, команда swap исчезнет. – AGamePlayer 11 February 2014 в 22:09

Я бы посоветовал использовать скрипт bash вместо того, чтобы играть с bash.conf.

Если вы попадаете в системы Unix, в какой-то момент вам нужно будет изучить сценарии оболочки.

2
ответ дан 25 May 2018 в 17:49
  • 1
    Зачем? Я действительно думал об использовании решения функции bash – brillout 21 October 2011 в 05:11
  • 2
    Shell scripting - огромная часть Unix-систем. Вы учитесь гораздо больше, учась писать сценарии, чем те типы решений. Shell scripting и Perl - это две вещи, которые вам действительно нужно узнать, если вы серьезно относитесь к unix. tldp.org/LDP/Bash-Beginners-Guide/html – Brandon Weaver 21 October 2011 в 05:58

Этот скрипт делает 2 вещи:

проверяет, не ошибался ли вы неправильное количество аргументов, проверяет, являются ли оба аргумента файлами (не ошибайтесь и не используйте каталог или что-то еще).

Если он не прошел какие-либо из этих двух проверок, он расскажет вам, как запустить скрипт, иначе вы будете заменены ваши файлы.

#! /bin/sh

if [ ! $# = 2 -o ! -f $1 -o ! -f $2 ]
then
    echo "Usage: `basename $0` file1 file2."
    exit
fi

mv $1 cop_$1
mv $2 $1
mv cop_$1 $2

Сохраните его в своем доме, используйте chmod +x <scriptname>.sh, чтобы сделать его исполняемым, переместите его в /usr/bin/ с помощью команды sudo cp <scriptname>.sh /usr/bin/.

Теперь вы можете использовать <nameofthescrip> file1 file2 для обмена файлами.

1
ответ дан 25 May 2018 в 17:49
  • 1
    Вы забыли процитировать переменные разложения. – geirha 9 April 2012 в 02:23

Я согласен с Bruno, сценарий оболочки больше подходит для добавления функций типа команды. Я предлагаю дополнительные предложения:

1- для использования, не включайте период в конце сообщения. Вы пытаетесь показать синтаксис и сообщение «Использование: swap file1 file2». возможно, вводит в заблуждение, это не предложение и должно просто сказать: «Использование: swap file1 file2»

2- Размещение файла в / use / bin делает его системной. Хотя ваша личная установка Ubuntu может выдержать это, когда вы решили переустановить с нуля, вы запишете свой домашний каталог, а не / usr / bin. Я предлагаю вам создать $ HOME / bin, добавить это к вашему пути поиска и поместить все ваши скрипты в этот каталог.

3- Если вы поместите функцию в bashrc, то она доступна только в оболочке bash, если вы хотите, чтобы swap был доступен независимо от оболочки, тогда скрипт оболочки в каталоге bin более универсален и стандартный.

4- В сценарии я предлагаю, чтобы выход после выхода Usage был изменен на «exit 1», а после последней строки (третья команда mv) добавить « выход 0 ". Код выхода указывает на успех или неудачу. Если вы когда-либо пишете другие скрипты, которые используют swap, они могут проверить код выхода, чтобы увидеть, был ли успех или неудача.

5- Вместо cop_ $ 1, который предполагает, что файл cop_ не существует, я предлагаю mktemp, используя параметр --tmpdir, он создает временный файл в текущем каталоге. Это гарантирует отсутствие конфликтующих имен файлов.

Объединяя все это, я предлагаю следующее:

#!/bin/sh 
if [ ! $# = 2 ] ; then
    echo "Usage: `basename $0` file1 file2"
    echo "Two file names are required."
    exit 1
fi
if [ ! -f $1 -o ! -f $2 ] ; then
    echo "Usage: `basename $0` file1 file2"
    echo "Only file names are allowed."
    exit 1
fi

TEMP=`mktemp --tmpdir=.`

mv $1 ${TEMP}
mv $2 $1
mv ${TEMP} $2
exit 0

Теперь поместите это в каталог bin в вашем домашнем каталоге. Убедитесь, что ваша переменная PATH принимает этот домашний каталог echo $PATH. Если это не так, PATH устанавливается в ресурсы инициализации оболочки (.bashrc или .cshrc или ???).

cd
mkdir bin
nano swap
< now paste the above script into the file, save, and exit>
chmod 755 swap
nano $HOME/.bashrc
< now add the following 2 lines at the end of the file, save, and exit>
# user specific pathing
PATH="$HOME/bin:$PATH"

Теперь вы либо запускаете новую оболочку bash, либо перерабатываете .bashrc file:

source .bashrc

Новый логин или оболочки должны быть автоматическими.

Thats it. Протестируйте только командой свопа, и вы увидите текст использования.

1
ответ дан 25 May 2018 в 17:49
  • 1
    Вы забыли процитировать переменные разложения. Кроме того, не добавляйте к PATH в ~/.bashrc. ~/.profile уже добавляет "$HOME/bin" в PATH. – geirha 9 April 2012 в 02:24

Другие вопросы по тегам:

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