0

我正在编写一个shell脚本,如下所示:

for file in `ls`
do
  mkdir "$file"_folder
  cp $file "$file"_folder
done

我想要做的是为当前目录中的每个文件创建一个文件夹,并为其命名,然后将下划线文件夹作为名称,然后将该文件复制到其中。我的问题是文件名中包含空格。我该如何逃脱它们?有很多资源解释了如何对变量执行此操作,但没有一个可以应用于我使用 for 循环获取名称的这种情况。

4

3 回答 3

2

不要在ls那里使用,使用shell globbing。(一般情况下,不要解析 . 的输出 ls。)

for file in *
do
  # only consider files, not directories
  if [ -f "$file" ] ; then
    new_dir="$file"_folder
    # create the directory
    if [ ! -d "$new_dir" ] ; then
      mkdir "$new_dir"
      if [ $? -ne 0 ] ; then
        # handle directory creation eror
      fi
    fi
    # possibly check for the copied file existence here
    # and deal with that appropriately (i.e. skip/error/copy anyway)
    cp "$file" "$new_dir"
  fi
done
于 2013-05-02T05:55:24.107 回答
1

怎么样

find . -type f -exec mkdir {}_folder \; -exec cp {} {}_folder \;

它在当前目录中查找所有常规文件,创建文件夹(第一个-exec),并将文件复制到新文件夹中(第二个-exec)。

于 2013-05-02T05:58:26.177 回答
0

ls正是出于这个原因进行解析

for file in *
do
  mkdir "${file}_folder"
  cp "$file" "${file}_folder"
done
于 2013-05-02T05:55:33.383 回答