Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在unix中将文件夹移动到按字母顺序排列的子目录中_Linux_Unix_Subdirectory_Mv - Fatal编程技术网

Linux 在unix中将文件夹移动到按字母顺序排列的子目录中

Linux 在unix中将文件夹移动到按字母顺序排列的子目录中,linux,unix,subdirectory,mv,Linux,Unix,Subdirectory,Mv,给定一个包含公司名称的文件夹: Ace inc Austerity A to Z Beeline Industries Bing Booze inc. Crypto .... Zeebra …我需要将所有A*文件夹移动到子目录A: A/Ace inc A/Austerity A/A to Z ... 我尝试了以下命令:mva*/A/,该命令一直工作到某个点,然后失败,因为它试图将新创建的A/移动到自身中 进一步-我觉得已经运行了一次这个命令,我可能把文件系统弄得一团糟。在开始移动之前,您想

给定一个包含公司名称的文件夹:

Ace inc
Austerity
A to Z
Beeline Industries
Bing
Booze inc.
Crypto
....
Zeebra 
…我需要将所有A*文件夹移动到子目录A:

A/Ace inc
A/Austerity
A/A to Z
...
我尝试了以下命令:
mva*/A/
,该命令一直工作到某个点,然后失败,因为它试图将新创建的
A/
移动到自身中


进一步-我觉得已经运行了一次这个命令,我可能把文件系统弄得一团糟。

在开始移动之前,您想创建一个文件名列表。除非您是以超级用户或根用户身份运行,否则您不应该写入
/…
,因此您不应该对任何内容进行修改(您很可能将包含原始文件的子目录弄得一团糟…)

要在当前目录中创建文件列表并逐个循环,只需在*中为fname使用
;做完成
。您需要引用所有后续使用的
fname
,以防止分词。由于您还标记了问题
shell
而不是
bash
等,因此需要使用符合POSIX的方式来获取每个文件名的第一个字符(
fc
)。为此,您可以在命令替换中使用旧的
expr substr“$fname”11
,例如:

    fc=$(expr substr "$fname" 1 1)  ## use 'expr substr ...' to get 1st char
将其放在一个与POSIX兼容的shell脚本中,该脚本仅对当前目录中的文件进行操作。根据文件名的第一个字符,将当前目录中的所有文件移动到适当的子目录中,您可以执行以下操作:

#!/bin/sh

for fname in *; do                  ## loop over each file
    [ -d "$fname" ] && continue     ## skip all directory names
    fc=$(expr substr "$fname" 1 1)  ## use 'expr substr ...' to get 1st char
    mkdir -p "$fc" || exit 1        ## create the directory or exit
    mv "$fname" "$fc" || exit 1     ## move the file or exit
done
结果目录结构

$ bash script.sh
$ tree .
.
├── A
│   ├── A to Z
│   ├── Ace inc
│   ├── Apples
│   │   ├── file1
│   │   └── file2.3
│   └── Austerity
├── B
│   ├── Beeline Industries
│   ├── Bing
│   └── Booze inc.
├── C
│   ├── Cans
│   │   ├── file1
│   │   ├── file2
│   │   └── file3
│   └── Crypto
├── Z
│   └── Zeebra
└── script.sh
使用示例列表中提供的文件名将产生以下目录结构:

$ tree .
.
├── A
│   ├── A to Z
│   ├── Ace inc
│   └── Austerity
├── B
│   ├── Beeline Industries
│   ├── Bing
│   └── Booze inc.
├── C
│   └── Crypto
└── Z
    └── Zeebra
如果您需要帮助修复文件系统,您需要在其他StackExchange站点上询问这个问题,或者因为它与“编程”无关

如果您有
bash
或其他支持字符串索引作为参数扩展的shell,那么使用它来获取第一个字符将更快,并避免使用
$(expr…

如果您有关于将文件移动到子目录的更多问题,请告诉我

根据说明进行编辑以不移动当前目录中的文件

好的,如果我们已经了解到(1)您正在以shell的形式运行
bash
,(2)您不想移动当前目录下子目录下的文件,以及(3)只想移动工作目录中包含的目录(及其内容)在根据目录名的第一个字符创建的目录下,您可以进行以下更改:

#!/bin/bash

for fname in *; do                  ## loop over each file
    [ -f "$fname" ] && continue     ## skip files in the current dir
    fc=${fname:0:1}                 ## use parameter expansion for 1st char
    mkdir -p "$fc" || exit 1        ## create the directory or exit
    [ "$fc" = "$fname" ] && continue    ## don't move dir into itself
    mv "$fname" "$fc" || exit 1     ## move the directory or exit
done
原始目录结构

$ bash script.sh
$ tree .
.
├── A
│   ├── A to Z
│   ├── Ace inc
│   ├── Apples
│   │   ├── file1
│   │   └── file2.3
│   └── Austerity
├── B
│   ├── Beeline Industries
│   ├── Bing
│   └── Booze inc.
├── C
│   ├── Cans
│   │   ├── file1
│   │   ├── file2
│   │   └── file3
│   └── Crypto
├── Z
│   └── Zeebra
└── script.sh
您的脚本位于当前目录以及
Apples
Cans
的其他目录中的示例,其中包含需要分别移动到
'A'
'C'
目录下的文件:

$ tree .
.
├── A
│   ├── A to Z
│   ├── Ace inc
│   └── Austerity
├── Apples
│   ├── file1
│   └── file2.3
├── B
│   ├── Beeline Industries
│   ├── Bing
│   └── Booze inc.
├── C
│   └── Crypto
├── Cans
│   ├── file1
│   ├── file2
│   └── file3
├── Z
│   └── Zeebra
└── script.sh
示例使用

$ bash script.sh
$ tree .
.
├── A
│   ├── A to Z
│   ├── Ace inc
│   ├── Apples
│   │   ├── file1
│   │   └── file2.3
│   └── Austerity
├── B
│   ├── Beeline Industries
│   ├── Bing
│   └── Booze inc.
├── C
│   ├── Cans
│   │   ├── file1
│   │   ├── file2
│   │   └── file3
│   └── Crypto
├── Z
│   └── Zeebra
└── script.sh
结果目录结构

$ bash script.sh
$ tree .
.
├── A
│   ├── A to Z
│   ├── Ace inc
│   ├── Apples
│   │   ├── file1
│   │   └── file2.3
│   └── Austerity
├── B
│   ├── Beeline Industries
│   ├── Bing
│   └── Booze inc.
├── C
│   ├── Cans
│   │   ├── file1
│   │   ├── file2
│   │   └── file3
│   └── Crypto
├── Z
│   └── Zeebra
└── script.sh

仔细看一下,让我知道我们是否已经就你们需要完成的事情达成了共识

您希望在开始移动之前创建一个文件名列表。除非您是以超级用户或根用户身份运行,否则您不应该写入
/…
,因此您不应该对任何内容进行修改(您很可能将包含原始文件的子目录弄得一团糟…)

要在当前目录中创建文件列表并逐个循环,只需在*中为fname使用
;做完成
。您需要引用所有后续使用的
fname
,以防止分词。由于您还标记了问题
shell
而不是
bash
等,因此需要使用符合POSIX的方式来获取每个文件名的第一个字符(
fc
)。为此,您可以在命令替换中使用旧的
expr substr“$fname”11
,例如:

    fc=$(expr substr "$fname" 1 1)  ## use 'expr substr ...' to get 1st char
将其放在一个与POSIX兼容的shell脚本中,该脚本仅对当前目录中的文件进行操作。根据文件名的第一个字符,将当前目录中的所有文件移动到适当的子目录中,您可以执行以下操作:

#!/bin/sh

for fname in *; do                  ## loop over each file
    [ -d "$fname" ] && continue     ## skip all directory names
    fc=$(expr substr "$fname" 1 1)  ## use 'expr substr ...' to get 1st char
    mkdir -p "$fc" || exit 1        ## create the directory or exit
    mv "$fname" "$fc" || exit 1     ## move the file or exit
done
结果目录结构

$ bash script.sh
$ tree .
.
├── A
│   ├── A to Z
│   ├── Ace inc
│   ├── Apples
│   │   ├── file1
│   │   └── file2.3
│   └── Austerity
├── B
│   ├── Beeline Industries
│   ├── Bing
│   └── Booze inc.
├── C
│   ├── Cans
│   │   ├── file1
│   │   ├── file2
│   │   └── file3
│   └── Crypto
├── Z
│   └── Zeebra
└── script.sh
使用示例列表中提供的文件名将产生以下目录结构:

$ tree .
.
├── A
│   ├── A to Z
│   ├── Ace inc
│   └── Austerity
├── B
│   ├── Beeline Industries
│   ├── Bing
│   └── Booze inc.
├── C
│   └── Crypto
└── Z
    └── Zeebra
如果您需要帮助修复文件系统,您需要在其他StackExchange站点上询问这个问题,或者因为它与“编程”无关

如果您有
bash
或其他支持字符串索引作为参数扩展的shell,那么使用它来获取第一个字符将更快,并避免使用
$(expr…

如果您有关于将文件移动到子目录的更多问题,请告诉我

根据说明进行编辑以不移动当前目录中的文件

好的,如果我们已经了解到(1)您正在以shell的形式运行
bash
,(2)您不想移动当前目录下子目录下的文件,以及(3)只想移动工作目录中包含的目录(及其内容)在根据目录名的第一个字符创建的目录下,您可以进行以下更改:

#!/bin/bash

for fname in *; do                  ## loop over each file
    [ -f "$fname" ] && continue     ## skip files in the current dir
    fc=${fname:0:1}                 ## use parameter expansion for 1st char
    mkdir -p "$fc" || exit 1        ## create the directory or exit
    [ "$fc" = "$fname" ] && continue    ## don't move dir into itself
    mv "$fname" "$fc" || exit 1     ## move the directory or exit
done
原始目录结构

$ bash script.sh
$ tree .
.
├── A
│   ├── A to Z
│   ├── Ace inc
│   ├── Apples
│   │   ├── file1
│   │   └── file2.3
│   └── Austerity
├── B
│   ├── Beeline Industries
│   ├── Bing
│   └── Booze inc.
├── C
│   ├── Cans
│   │   ├── file1
│   │   ├── file2
│   │   └── file3
│   └── Crypto
├── Z
│   └── Zeebra
└── script.sh
您的脚本位于当前目录以及
Apples
Cans
的其他目录中的示例,其中包含需要分别移动到
'A'
'C'
目录下的文件:

$ tree .
.
├── A
│   ├── A to Z
│   ├── Ace inc
│   └── Austerity
├── Apples
│   ├── file1
│   └── file2.3
├── B
│   ├── Beeline Industries
│   ├── Bing
│   └── Booze inc.
├── C
│   └── Crypto
├── Cans
│   ├── file1
│   ├── file2
│   └── file3
├── Z
│   └── Zeebra
└── script.sh
示例使用

$ bash script.sh
$ tree .
.
├── A
│   ├── A to Z
│   ├── Ace inc
│   ├── Apples
│   │   ├── file1
│   │   └── file2.3
│   └── Austerity
├── B
│   ├── Beeline Industries
│   ├── Bing
│   └── Booze inc.
├── C
│   ├── Cans
│   │   ├── file1
│   │   ├── file2
│   │   └── file3
│   └── Crypto
├── Z
│   └── Zeebra
└── script.sh
结果目录结构

$ bash script.sh
$ tree .
.
├── A
│   ├── A to Z
│   ├── Ace inc
│   ├── Apples
│   │   ├── file1
│   │   └── file2.3
│   └── Austerity
├── B
│   ├── Beeline Industries
│   ├── Bing
│   └── Booze inc.
├── C
│   ├── Cans
│   │   ├── file1
│   │   ├── file2
│   │   └── file3
│   └── Crypto
├── Z
│   └── Zeebra
└── script.sh
仔细看看这个