英文:
Recursive folder action
问题
对于文件夹中的文件,我正在使用以下代码:
for file in *.wav; do sox "$file" "n_$file" silence 1 0.1 0.1% reverse silence 1 0.1 0.1% reverse; done
我想要删除所有子文件夹和子子文件夹中的文件的静音部分。我希望删除静音后的版本保存在与原始文件相同的文件夹中。
我目前使用的代码只在当前文件夹中执行此操作。
英文:
For the files in a folder I'm using
for file in *.wav; do sox "$file" "n_$file" silence 1 0.1 0.1% reverse silence 1 0.1 0.1% reverse; done
I want to strip silence all the files in sub & subsub folders. I want the strip silenced versions in the same folder as originals.
The code I use just does it inside the current folder.
答案1
得分: 0
这可能会起作用,具体取决于您使用的find
命令版本的工作方式。它应该可以在 macOS 自带的版本中工作,但我不认为它会在 GNU find
中起作用。您应该首先进行测试,将sox
命令替换为echo
,以查看它将执行什么操作。
find . -type f -name "*.wav" -execdir sox {} n_{} silence 1 0.1 0.1% reverse silence 1 0.1 0.1% reverse \;
find
将查找具有匹配名称的文件,并在替换命令中的{}
与文件名之后运行-execdir
命令。
使用普通的-exec
选项不会起作用,因为它会提供文件的路径,而不仅仅是文件名,因此在前面添加“n_”不会产生您想要的效果。例如,它会将“./subdir/file.wav”变成“n_./subdir/file.wav”,而不是“./subdir/n_file.wav”。-execdir
会进入文件所在的目录,然后只使用文件名运行它。
至少,在 macOS 自带的 bsd 版本中是这样的。Linux 使用的 GNU 版本似乎在文件名前面加上了“./”,这通常不重要,但在这种情况下会导致“n_./file.wav”等荒谬的结果。因此,首先使用echo
进行测试,并确保它提供了预期的文件名。
顺便说一下,我认为还有一些其他版本的find
不会在n_{}
中替代文件名(只有使用{}
本身),在这种情况下,这种方法将以另一种方式失败。
英文:
This may work, depending on exactly how your version of the find
command works. It should work with the version that comes with macOS, but I don't think it'll work with GNU find
. You should test it first, by replacing the sox
command with echo
, to see what it's going to do.
find . -type f -name "*.wav" -execdir sox {} n_{} silence 1 0.1 0.1% reverse silence 1 0.1 0.1% reverse \;
find
will find files with matching names, and run the -execdir
command, after replacing the {}
in the command with the filename.
Using the plain -exec
option won't work, because it'd give the file's path, rather than just the filename, so prepending "n_" wouldn't do what you want. For example, it'd turn "./subdir/file.wav" into "n_./subdir/file.wav" rather than "./subdir/n_file.wav". -execdir
instead does a cd
into the file's directory, and then runs it with just the filename.
At least, that's what the bsd version that comes with macOS does. The GNU version that Linuxes use seems to put "./" in front of the filename; this usually doesn't matter, but in this case it gives silliness like "n_./file.wav". So test with echo
first, and make sure it gives the expected filenames.
BTW, I think there are some other versions of find
that won't substitute the filename in n_{}
(only with {}
by itself) in which case this'll fail in yet another way.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论