如何仅移动非目录文件

如何仅移动非目录文件

假设我正在组织一个目录。它看起来像这样:

.
├── file_a.adoc
├── file_a.c
├── file_a.py
├── file_b.adoc
├── file_b.c
├── file_b.py
├── file_c.adoc
├── file_c.c
└── file_c.py

现在我在这一点上:

.
├── a
│   ├── file_a.adoc
│   ├── file_a.c
│   └── file_a.py
├── b
│   ├── file_b.adoc
│   ├── file_b.c
│   └── file_b.py
├── c
├── file_c.adoc
├── file_c.c
└── file_c.py

我想要一个可以将所有剩余的非目录文件移动到 dir c 中的命令。

在这个例子中我可以使用

mv *_c* c

但在更现实的情况下,您可能没有一个好的模式可以抓住,或者可能不关心确定一个模式。

答案1

一种方法是“将文件中的所有内容移至 c 中”的直译:

for f in *; do if [ -f "$f" ]; then mv "$f" c; fi; done

或者避免 if-then 的冗长:

for f in *; do [ -f "$f" ] && mv "$f" c; done

更好,不会在set -eshell 中失败:

for f in *; do [ -f "$f" ] && mv "$f" c || true; done

我的偏好是,当且仅当其中一项操作失败时才会失败:

for f in *; do [ ! -f "$f" ] || mv "$f" c; done

从字面上看:对于每个 f,要么它不是一个文件,要么它被移动到 c,要么我们中止。

答案2

使用zsh外壳:

mv -- *(.) c

这扩展了*通配模式,但通配限定符(.)将其过滤为仅包含常规文件的名称。然后将它们交给mv命令并全部移动到c目录中。

来自非zshshell:

zsh -c 'mv -- *(.) c'

您可以使用字面意思是“非目录”的名称,而不是使用通配符(.)来仅选择常规文件的名称。(^/)不同之处在于,它还*(^/)可以匹配符号链接和其他非目录文件类型的名称。

答案3

for i in a b c; do
  mkdir "$i" # use -p if you need it
  find . -type f -name "*_$i.*" -exec mv -t "$i" {} + # or, mv {} "$i" \;
done

相关内容