gparted
CD помогает переместить и изменить размер разделов и наиболее распространенных файловых систем (включая Linux ext2/3/4 и xfs и Windows NTFS).
Предложенная процедура должна клонировать старый SSD к новому (например, с dd
), затем загрузитесь в gparted CD, переместите раздел Linux в конец диска, затем разверните раздел NTFS).
gparted
может использоваться, чтобы сделать клонирование, а также изменение размеров.
Другой альтернативой является Clonezilla, который может также сделать клонирование дисков и изменение размеров раздела, но с интерфейсом меню текстового режима, а не GUI. IMO это более способно и featureful, чем gparted (и существует 64-разрядных версий, а также 32-разрядный, который полезен, если Вам нужно к chroot в 64-разрядный Linux rootfs для спасения/восстановлений), но может быть более твердо использовать.
Конечно, легче сделать клонирование дисков в Clonezilla, таким образом, можно хотеть использовать и - загружают CD Clonezilla для клонирования и затем загружаются в GParted для легкого изменения размеров GUI.
Не используйте подстановку команд на выходе найти
. Здесь все можно сделать с помощью find
:
find . -mtime 1 -type f ! -exec lsof -t {} \; -exec rm -f {} \; > /dev/null
С помощью нескольких реализаций find
(включая FreeBSD find
, откуда она пришла, и GNU find
), вы можете использовать -delete
вместо -exec rm ...
.
Причина, по которой вы получаете сообщение об ошибке, заключается в том, что нет команды между , затем
и else
, а некоторые оболочки (начиная с оболочки Bourne, из которой взят этот синтаксис) требуют как минимум один (а комментарий не является командой). Обратите внимание, что это совершенно произвольно, и нет никаких причин, по которым эти оболочки будут делать это. yash
и zsh
не имеют этого ограничения (, если ложь; тогда еще echo x; fi
и даже , если ложь; тогда еще fi
] отлично с ними работают).
Как говорили другие, вы можете использовать команду noop наподобие :
(или ничего не делать; ничего не делать; сделано
) или изменить логику с помощью !
ключевое слово (доступно в оболочках POSIX,но не оболочку Борна (вы обнаружите, что использование :
для этого было обычным в этой оболочке)). mksh
и yash
поддерживают , если ложно; then () else echo x; fi
(я бы не стал на это полагаться, поскольку это может измениться в будущих версиях).
Другой подход заключается в следующем:
lsof... || {
cmd1
cmd2
}
хотя одно отличие заключается в общем статусе выхода, который будет таким же, как у lsof
, если lsof
завершится неудачно.
Другая альтернатива: переверните вашу логику.
if ! lsof "$filename" >/dev/null;then
echo "deleting $filename"
rm "$filename"
fi
Похоже, вы хотите выполнить запрет на выполнение операций , если файл открыт, поэтому вам следует добавить :
, которая является пустой командой в bash
:
if lsof "$filename" > /dev/null; then
# file is open
:
else
printf 'deleting %s\n' "$filename"
rm -- "$filename"
fi
Если вы не используете :
, bash
не сможет проанализировать ваш код и покажет ошибка типа bash: синтаксическая ошибка рядом с неожиданным токеном else
.
Ни один из других ответов на самом деле не отвечает на ваш исходный вопрос о том, почему команда выдает синтаксическую ошибку. Это вызвано отсутствием команды между , затем и else .
Ваш исходный код выглядит так:
if lsof "$filename" > /dev/null
then
# file is open
else
echo "deleting $filename"
rm "$filename"
fi
Проблема в том, что у вас есть комментарий между , затем и else , но комментария нет рассматривается как команда. Короче говоря, вы можете переписать возникшую у вас проблему (с точки зрения структуры) следующим образом:
$ if true; then else echo; fi
bash: syntax error near unexpected token `else'
. Вы можете решить эту проблему, поместив фактические команды перед else , но комментарий сам по себе не годится. Раздел if-then не может быть пустым; если вам нужен заполнитель, вы можете использовать встроенное двоеточие . Например:
$ if true; then :; else echo; fi
Простое размещение :
в разделе между , затем и else исправит синтаксическую ошибку, с которой вы столкнулись.