Не знаю, поможет ли это вам, но вы можете переписать свой код как здесь:
#!/bin/bash -l
#$ -S /bin/bash
#$ -N $1
rm -rf ~/.minecraft
cp -rn /media/$1/MC/minecraft ~/
mv /home/$1/minecraft /home/$1/.minecraft
java -jar Minecraft.jar
и указать пользователя в аргументе: sh this_script.sh user
будет использовать путь /media/user
.
Если вам нужен текущий пользователь, используйте:
sh this_script.sh `whoami`
Возможно, вы можете добавить sudo
перед командами, если вам это нужно.
Направить список файлов в команду архивирования напрямую вместо xargs
, что может (и делает в некоторых случаях) разделить список на несколько вызовов архиватора. .
Здесь используется стандартная команда pax
с нестандартными расширениями -print0
/ -0
, поддерживаемыми некоторыми для повышения надежности:
find /data/mysqldata ! -name "*mysql-bin*" ! -name "*.log" -print0 |
pax -0wd | gzip > file.tar.gz
(также обратите внимание на -d
, без которого все файлы были бы включены в любом случае, поскольку архивирование /data/mysqldata
(которое не соответствует ни одному шаблону исключения) означало бы архивирование всего, как в вашем tar
подход).
Помимо pax
многие реализации tar
поддерживают получение списка файлов из стандартного ввода, но обычно с другим интерфейсом между реализациями.
Использование GNUtar
:
tar -cz -f /data/backup.tgz --exclude '*.log' --exclude 'mysql-bin.*' /data/mysqldata
Проблема, с которой вы столкнулись, заключалась в том, что xargs
выполнялось tar
несколько (не менее двух )раз. При втором запуске tar
файл резервной копии «сжимался» (и перезаписывался ).
Вот что делает xargs
. Он выполняет утилиту с максимально возможным количеством аргументов, и когда он получает больше аргументов (имен файлов в вашем случае ), он обрезает список и продолжает со списком в другом вызове утилиты.
Проблема возникла , потому что вы отправили каждый каталог и имя файла на xargs
, создав очень длинный список.