Linux 当前目录下所有子目录添加后缀
Add suffix to all subdirectories in current directory in Linux
当前目录下:文件夹:001、002、003、004……等。我想将后缀“_ses-1”添加到所有文件夹,例如 001_ses-1
尝试过
for d in *; do mv "$d" "${d}_ses-1"; done
find ./ -type d -exec bash -c mv "$folder" "${folder}_ses-1"
都失败了,希望得到一些帮助来解决这个问题。
假设这是一个 one-off 任务,它不需要递归,一个技巧是将 ls
的输出通过管道传输到一个文本文件中,运行 一个宏(例如在 vim 中)将它们转换为正确的 mv
命令,然后 运行 整个脚本。
另一种选择是使用 bash 生成每个命令(类似于您已经尝试过的命令)作为单独的 mv
命令并通过管道传输到一个文件中,然后 运行作为脚本。
第一个命令 (for
) 不会只匹配目录。
如果您有嵌套目录,第二个 (find
) 会有问题。
如果您没有嵌套文件夹,您可以使用:
find . -maxdepth 1 -type d -exec mv {} {}_ext \;
我喜欢 find ./
方法,但它可能会找到 .
和 ..
然后在移动它们时失败。
find ./ -type d ! -name . ! -name .. -exec bash -c mv "$folder" "${folder}_ses-1"
对于 for d in *;
方法,您需要这样做以遍历列表:
for d in `ls -1`; do mv "$d" "${d}_ses-1"; done
使用rename
命令,可以这样使用:find ... | xargs rename ...
。 rename
命令有多种实现方式,非常强大。它可以用于比简单的 mv
.
复杂得多的操作
示例:
# Create a tiny test with 4 input directories:
$ mkdir 001 002 003 004
$ ls -d 00[1-4]*
001 002 003 004
# Do a dry run first using -n option:
$ find . -type d -name '00[1-4]' | xargs rename -n 's/$/_ses-1/'
'./001' would be renamed to './001_ses-1'
'./003' would be renamed to './003_ses-1'
'./004' would be renamed to './004_ses-1'
'./002' would be renamed to './002_ses-1'
# Actually rename for real:
$ find . -type d -name '00[1-4]' | xargs rename 's/$/_ses-1/'
# Confirm the results:
$ ls -d 00[1-4]*
001_ses-1 002_ses-1 003_ses-1 004_ses-1
请注意 rename
可以轻松安装,例如 conda
:
conda install rename
另请参见:
rename
手册(很有帮助):
rename --man
例如:
-n, --dry-run, --just-print
Show how the files would be renamed, but don't actually do anything.
当前目录下:文件夹:001、002、003、004……等。我想将后缀“_ses-1”添加到所有文件夹,例如 001_ses-1
尝试过
for d in *; do mv "$d" "${d}_ses-1"; done
find ./ -type d -exec bash -c mv "$folder" "${folder}_ses-1"
都失败了,希望得到一些帮助来解决这个问题。
假设这是一个 one-off 任务,它不需要递归,一个技巧是将 ls
的输出通过管道传输到一个文本文件中,运行 一个宏(例如在 vim 中)将它们转换为正确的 mv
命令,然后 运行 整个脚本。
另一种选择是使用 bash 生成每个命令(类似于您已经尝试过的命令)作为单独的 mv
命令并通过管道传输到一个文件中,然后 运行作为脚本。
第一个命令 (for
) 不会只匹配目录。
如果您有嵌套目录,第二个 (find
) 会有问题。
如果您没有嵌套文件夹,您可以使用:
find . -maxdepth 1 -type d -exec mv {} {}_ext \;
我喜欢 find ./
方法,但它可能会找到 .
和 ..
然后在移动它们时失败。
find ./ -type d ! -name . ! -name .. -exec bash -c mv "$folder" "${folder}_ses-1"
对于 for d in *;
方法,您需要这样做以遍历列表:
for d in `ls -1`; do mv "$d" "${d}_ses-1"; done
使用rename
命令,可以这样使用:find ... | xargs rename ...
。 rename
命令有多种实现方式,非常强大。它可以用于比简单的 mv
.
示例:
# Create a tiny test with 4 input directories:
$ mkdir 001 002 003 004
$ ls -d 00[1-4]*
001 002 003 004
# Do a dry run first using -n option:
$ find . -type d -name '00[1-4]' | xargs rename -n 's/$/_ses-1/'
'./001' would be renamed to './001_ses-1'
'./003' would be renamed to './003_ses-1'
'./004' would be renamed to './004_ses-1'
'./002' would be renamed to './002_ses-1'
# Actually rename for real:
$ find . -type d -name '00[1-4]' | xargs rename 's/$/_ses-1/'
# Confirm the results:
$ ls -d 00[1-4]*
001_ses-1 002_ses-1 003_ses-1 004_ses-1
请注意 rename
可以轻松安装,例如 conda
:
conda install rename
另请参见:
rename
手册(很有帮助):
rename --man
例如:
-n, --dry-run, --just-print
Show how the files would be renamed, but don't actually do anything.