在 bash 脚本中使用“cp”

在 bash 脚本中使用“cp”

为什么这个脚本不起作用?它始终打开脚本所在的默认目录,无法打开新目录

#!/bin/bash

read -p "choose a directory: " map
list=$( ls )
for item in $list; do
    echo $item
    read -p "Make copy? " ans

    if [ $ans = "yes" ]; then        
        cp $item > mkdir $map+copy
    fi
done
echo "Done"

答案1

cp $item > mkdir $map+copy

好的,所以,>重定向命令的输出,即打印的部分(通常到您的终端)。例如,ls输出文件列表,因此ls > list.txt将输出该列表list.txt。但例如cp foo bar显式打开文件foobar,但不向终端输出任何内容。

因此,此处的重定向为您提供了一个名为 的空文件mkdir,但命令的其余部分cp $list $map+copy会将名为 的文件复制$list到扩展为的任何内容$map+copy(变量$map和固定字符串的内容+copy,连接在一起)。

另一方面,cat foo将打开foo并打印它,您可以使用cat foo > bar将该打印输出定向到名为bar.实际上,与执行操作几乎相同cp foo bar,只是cp可以选择点赞-a以及-p复制所有者和权限信息。

而且,在 shell 中,您可以通过将字符串彼此相邻(中间没有任何空格)来连接字符串。因此,如果您设置变量x=foo y=bar,所有这些都会打印foobar

echo foobar
echo "foo""bar"
echo "$x$y"
echo "foo$y"
echo "${x}bar"

这意味着您可以将"${map}copy"两个"$map""copy"部分连接起来。

不过,您确实需要mkdir与 分开运行cp,因此如果$mapcontainsfoobar$itemis hello.txt,这将创建一个目录foobarcopy,并复制hello.txt到该目录:

mkdir -p "${map}copy"
cp "$item" "${map}copy"

-p告诉mkdir如果目录已经存在则不要出错。)

看:

对于问题。 (不是)双引号变量。


另外,代替:

list=$( ls )
for item in $list; do

您可以让 shell 生成文件名列表,而无需调用ls

for item in ./*; do

看:

相关内容