#linux #bash #shell #debian
Вопрос:
Я новичок в linux и скриптах оболочки в целом. Я использую дистрибутив Debian на WSL (подсистема Windows для Linux). Я пытаюсь написать очень простой сценарий bash, который будет выполнять следующее:
- создайте файл в каталоге (дочерний каталог-a)
- переместитесь в каталог, в котором он находится
- переместите файл в другой каталог (дочерний каталог-b)
- переместитесь в этот каталог
- переместите файл в родительский каталог
Это то, что у меня есть до сих пор (пока я пытаюсь сделать все предельно простым).
touch child-directory-a/test.txt
cd child-directory-a
mv child-directory-a/test.txt home/username/child-directory-b
Первые две строки работают, но я продолжаю получать ошибку «такого каталога не существует» с последней. Каталог существует, и это правильный путь (проверено с помощью pwd). Я также пытался использовать разные пути (т. Е. дочерний каталог-b, имя пользователя/дочерний каталог-b и т. Д.), Но Безрезультатно. Я не могу понять, почему это не работает.
Я просмотрел форумы/документацию, и мне кажется, что эти команды должны работать так, как они работают в командной строке, но я, похоже, не могу сделать то же самое в сценарии.
Если бы кто-нибудь мог объяснить, чего мне не хватает/чего я не понимаю, это было бы блестяще.
Спасибо.
Комментарии:
1. На третьей строке вы, вероятно, хотите
/
, чтобы передhome
:/home/username/child-directory-b
. Вы также можете использовать специальную переменную среды$HOME
:mv child-directory-a/test.txt "$HOME/child-directory-b/"
Ответ №1:
Вы могли бы создать сценарий следующим образом:
#!/bin/bash
# Store both child directories on variables that can be loaded
# as environment variables.
CHILD_A=${CHILD_A:=/home/username/child-directory-a}
CHILD_B=${CHILD_B:=/home/username/child-directory-b}
# Create both child folders. If they already exist nothing will
# be done, and no error will be emitted.
mkdir -p $CHILD_A
mkdir -p $CHILD_B
# Create a file inside CHILD_A
touch $CHILD_A/test.txt
# Change directory into CHILD_A
cd $CHILD_A
# Move the file to CHILD_B
mv $CHILD_A/test.txt $CHILD_B/test.txt
# Move to CHILD_B
cd $CHILD_B
# Move the file to the parent folder
mv $CHILD_B/test.txt ../test.txt
Примите во внимание следующее:
- Мы удостоверяемся, что все папки существуют и созданы.
- Используйте переменные, чтобы избежать опечаток, с возможностью загрузки динамических значений из переменных среды.
- Используйте абсолютные пути, чтобы упростить перемещение между папками.
- Используйте относительные пути для перемещения файлов родственников туда, где мы находимся.
Еще одна команда, которая может оказаться полезной, — это pwd
. Он сообщит вам, в каком каталоге вы находитесь.
Ответ №2:
во второй строке вы меняете текущий каталог на дочерний каталог-a итак, в вашей третьей строке есть ошибка, потому что нет дочернего каталога-каталога-a в дочернем каталоге-каталоге-a
Вместо этого ваша третья строка должна быть :
mv test.txt ../child-directory-b
Пункт № 4 вашего сценария должен быть:
cd ../child-directory-b
(перед этой командой текущий каталог-home/имя пользователя/дочерний каталог-a, а после этой команды он становится home/имя пользователя/дочерний каталог-b)
Тогда пункт № 5 и заключительный пункт вашего сценария должны быть:
mv test.txt ..
ПРИМЕЧАНИЕ: вы можете отобразить текущий каталог в любой строке вашего сценария, используя команду pwd (распечатать рабочий каталог) в вашем сценарии, это помогает
Ответ №3:
#!/bin/sh
# Variables
WORKING_DIR="/home/username/example scripts"
FILE_NAME="test file.txt"
DIR_A="${WORKING_DIR}/child-directory-a"
DIR_B="${WORKING_DIR}/child-directory-b"
# create a file in a directory (child-directory-a)
touch "${DIR_A}/${FILE_NAME}"
# move to the directory it is in
cd "${DIR_A}"
# move the file to another directory (child-directory-b)
mv "${FILE_NAME}" "${DIR_B}/"
# move to that directory
cd "${DIR_B}"
# move the file to the parent directory
mv "${FILE_NAME}" ../