Перемещение файлов между каталогами с помощью скрипта оболочки

#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
 

Примите во внимание следующее:

  1. Мы удостоверяемся, что все папки существуют и созданы.
  2. Используйте переменные, чтобы избежать опечаток, с возможностью загрузки динамических значений из переменных среды.
  3. Используйте абсолютные пути, чтобы упростить перемещение между папками.
  4. Используйте относительные пути для перемещения файлов родственников туда, где мы находимся.

Еще одна команда, которая может оказаться полезной, — это 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}" ../