gpt4 book ai didi

linux - bash 有选择地将文件/文件夹复制到另一个位置

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:07 25 4
gpt4 key购买 nike

我的脚本中有一个循环,它遍历数组 - myArray,我需要在每次迭代时复制一些文件/目录。数组可以是这样的——

myArray=('ajax' 'style/prod_styles' `path/to/some_file.php` 'templates' 'uploadify')

使用这个数组,对于没有 / 的元素,我需要复制整个文件夹及其内容 - 例如ajax模板上传。但是对于那些有斜杠的 - 比如 style/prod_styles (注意可以有多个斜杠),我只需要复制最后一个元素(例如对于 /path/to/some/folder 我只需要复制 folder 及其内容),以防目标文件夹中不存在父文件夹(例如 pathtosome 是父文件夹),我只需要创建这些文件夹,然后复制最后一个元素(folder)。

早些时候我猜想在循环内使用 / 进行 explode (如 PHP 的 explode())很容易,然后从父级开始递归(path directory as per the above example) 检查其子目录是否存在,如果不存在则创建它,直到我们完成要复制的文件/目录的父目录,然后进行最终复制。

但是,如果 bash 中有更简单的方法可以做到这一点,请告诉我。

谢谢,
桑迪潘

最佳答案

除非我误解了你的问题,否则你可能不需要使用类似 explode 的工具来实现你想要的。

例子:

# dir to copy to    
DESTINATION='/path/to/copy/to/.'

# dir to copy from
SOURCE='.'

# list of dirs to copy
myArray=('ajax' 'style/prod_styles' 'templates' 'uploadify')

# for each directory in myArray ...
for d in "${myArray[@]}"
do
if [ -f "$d" ]; then # it this is a regular file

# create base directory
mkdir -p $DESTINATION/$(dirname "$d")

# copy the file
cp "$SOURCE/$d" $DESTINATION/$(dirname "$d")

elif [ -d "$d" ]; then # it is a directory

# create directory (including parent) if it doesn't exist
# - this does nothing if directory exists
mkdir -p "$DESTINATION/$d"

# recursive copy
cp -r "$SOURCE/$d/"* "$DESTINATION/$d/."

else

# write warning to stderr. do nothing with this entry
echo "WARNING: invalid entry $d." >&2

fi
done

更新:

更新了示例代码以维护目标内的相对路径。所以 styles/prod_styles 将被复制到 $DESTINATION/styles/prod_stylesstyles/ 中的所有其他内容不会被复制。

请注意,如果不能确定以下内容,则需要添加一些额外的检查:

  • DESTINATION 中指定的路径存在
  • 并非 myArray 中的所有值都是有效目录(不是文件)

更新 2:

更新示例代码以处理常规文件和目录。

关于linux - bash 有选择地将文件/文件夹复制到另一个位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4645642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com