所以我正在进行一项任务,要求我在bash中编写一个shell脚本,它将2个现有目录名作为前2个参数,并将2的内容复制到第3个参数指定的目录中。当2个目录只包含常规文件但是如果它们包含我遇到的任何目录时,这种情况有效。但是,cp:无法统计' {所有文件名}'"错误。如何修复此错误?
这是我的整个脚本。任何帮助将不胜感激。
#! /bin/bash
shopt -s expand_aliases
alias error='echo "usage: cpdirs.sh source_directory1 source_directory2 dest_directory"'
if [ $# -ne 3 ]
then
error
exit
fi
if [ -d $1 -a -d $2 ]
then
ls1=`ls "$1"`
ls2=`ls "$2"`
else
error
exit
fi
CD=`pwd`
if [ ! -d "$3" ]
then
mkdir "$3"
fi
cd "$3"
thrd=`pwd`
cd "$CD"
cd "$1"
ls1=${ls1//
/ }
if [ -n "$ls1" ]
then
cp -R "$ls1" "$thrd"
fi
cd "$CD"
cd "$2"
ls2=${ls2//
/ }
if [ -n "$ls2" ]
then
cp -R "$ls2" "$thrd"
fi
答案 0 :(得分:0)
要复制的单个文件需要作为单独的参数传递给cp
。您在单个参数中传递了一个以空格分隔的文件名列表 - 这意味着cp
正在尝试查找一个名称与所有连接在一起的单个文件目录中的单个文件名(因为这些名称由ls
提供)。
简短回答:不要这样做。 Don't use ls
programatically,特别是don't try to put multiple arguments in a single scalar variable。如果要在变量中存储多个文件名,请使用数组:
filenames=( * )
......扩展为:
cp -- "${filenames[@]}" /path/to/destination